核心数据 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
的值以获取 Device
和 device.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 关系的主要内容,如果未能解决你的问题,请参考以下文章