核心数据 Swift 3 关系

Posted

技术标签:

【中文标题】核心数据 Swift 3 关系【英文标题】:Core Data Swift 3 Relationship 【发布时间】:2017-06-14 16:18:35 【问题描述】:

我有两个实体,Device 和 MDM。设备有两个属性,asset_tag 和 location。 MDM 有两个属性,asset_tag 和 os。我正在尝试获取每个asset_tag 设备的asset_tag、操作系统和位置。我让 Xcode 创建了我的子类:

extension Device 

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Device> 
        return NSFetchRequest<Device>(entityName: "Device")
    

    @NSManaged public var asset_tag: String?
    @NSManaged public var location: String?
    @NSManaged public var devices: MDM?



extension MDM 

    @nonobjc public class func fetchRequest() -> NSFetchRequest<MDM> 
        return NSFetchRequest<MDM>(entityName: "MDM")
    

    @NSManaged public var asset_tag: String?
    @NSManaged public var os: String?
    @NSManaged public var mdms: Device?


我的获取请求如下:

var request = NSFetchRequest<NSFetchRequestResult>()
            request = Device.fetchRequest()
            request.returnsObjectsAsFaults = false
let results = try context.fetch(request) as! [Device]

不知道如何让device.mdms.os 之类的东西工作以获取特定设备的操作系统。

【问题讨论】:

如另一个问题中所述,您的命名令人困惑,请考虑约定。一对一的关系是device: Device(单数),一对多的关系是devices : NSSet(复数)。 我颠倒了我的关系并让 Xcode 重新制作了我的子类,所以现在它看起来像这样:@NSManaged public var devices: Device 再一次,devices(复数)表示许多个设备。对应的类型是NSSet。否则(一个设备,单数)使用device(没有尾随s)。 好的,我改了。如果我想引用一个设备并且它是 os.我认为它类似于device.mdms.os,但我该如何设置它来做到这一点?像这样的东西:let devices = NSEntityDescription.entity(forEntityName: "Device", in: context) 就像字符串属性一样,您已经在代码中设置了关系。创建设备,创建 mdms 并设置关系(伪代码)newDevice.mdm = newMDM 【参考方案1】:

看起来你的关系名称倒序了。现在,Device 有一个名为 devices 类型为 MDM 的关系,MDM 有一个名为 mdms 类型为 Device 的关系。这意味着您将获得 os 的值以获取 Devicedevice.devices.os,这可能不是您想要的方式。

要解决此问题,您可能需要颠倒这些关系的名称——在Device 中,将名称从devices 更改为mdms,在MDM 中,将名称从mdms 更改为@ 987654336@。一般来说,关系的名称应该描述它所涉及的事物,而不是具有这种关系的事物。

【讨论】:

好的,一旦完成,我如何使用device.devices.os 引用这些值。我是否将其设置为:let devices = NSEntityDescription.entity(forEntityName: "Device", in: context),然后使用devices.mdms.os 您可以创建实例,并获取您创建的实例。该行代码从您的数据模型中查找Device 实体,但不创建任何实例。如果您不确定如何操作,请参阅 Apple 的 Core Data Programming Guide 建立一个sqlite存储会更容易吗,因为我更习惯于数据库SQL而不是核心数据。 如果你喜欢,可以直接使用SQLite。这是否是一个好主意取决于您的应用程序需要什么。 SQL 可能更简单,但您将在模型对象和行之间进行更多开销转换,自己维护外键而不是让 Core Data 考虑,等等。 它在哪里谈到创建实例?我让 Xcode 根据我的对象模型为我创建了子类。

以上是关于核心数据 Swift 3 关系的主要内容,如果未能解决你的问题,请参考以下文章

Swift3 - 在核心数据中插入关系

swift核心数据获取关系

swift中的核心数据关系

Swift 核心数据关系和种子数据

核心数据一对多插入与现有关系swift

iOS (Swift):使用关系获取核心数据