在代码中设置关系,在父子节点都插入核心数据之后?
Posted
技术标签:
【中文标题】在代码中设置关系,在父子节点都插入核心数据之后?【英文标题】:Setting up relationship in the code, after both parent and child are inserted with Core Data? 【发布时间】:2014-11-25 23:58:27 【问题描述】:我有一个应用程序使用两个实体的核心数据:System
和 Owner
。每个System
有一个Owner
,每个Owner
可以“拥有”多个System
对象。这两个对象都是从远程JSON
提要中收集的,彼此独立。我GET
所有Owner
对象并使用Core Data 将它们加载到磁盘,然后我GET
所有System
对象并使用Core Data 将那些 加载到磁盘。
类似这样的:
Owner.createInManagedObjectContext(self.managedObjectContext!, ownerID: reducedID, fName: fName, lName: lName)
同样适用于System
对象。
我的Owner
类看起来像这样(自动生成)
class Owner: NSManagedObject
@NSManaged var firstName: String
@NSManaged var lastName: String
@NSManaged var id: String
class func createInManagedObjectContext(moc: NSManagedObjectContext, ownerID: String, fName: String, lName: String) -> Owner
let newOwner = NSEntityDescription.insertNewObjectForEntityForName("Owner", inManagedObjectContext: moc) as Owner
newOwner.id = ownerID
newOwner.firstName = fName
newOwner.lastName = lName
moc.save(nil)
return newOwner
System
对象看起来像这样(部分自动生成):
class System: NSManagedObject
@NSManaged var cid: String
@NSManaged var name: String
@NSManaged var addy: String
@NSManaged var rn: NSNumber
@NSManaged var rnGroup: String
@NSManaged var lng: String
@NSManaged var lat: String
@NSManaged var owner: Owner
@NSManaged var state: NSNumber
class func createInManagedObjectContext(moc: NSManagedObjectContext, sysCID: String, sysName: String, sysAddy: String, sysRN: Int, sysRNGroup: String, sysLat: String, sysLng: String) -> System
// more code...
我无法同时创建这些对象,因为Owner
JSON 提要可能与System
JSON 提要不同时可用。
我的问题是,如何在所有对象都存储到磁盘之后使用代码设置System
Owner 关系?
【问题讨论】:
【参考方案1】:再直观不过了:
system.owner = owner;
第一个owner
是关系名称,第二个是检索到的所有者对象。
顺便说一句:查看您的模型文件,您似乎忘记了所有者与系统之间的反向关系。也许您在完成模型设计之前生成了托管对象子类。
另外,我建议为id
属性使用不同的名称——我认为“id”是一个保留字,这可能会导致严重的错误。
如果您需要先获取所有者,请使用谓词,例如基于id
(我称之为ownerID
),做类似的事情
var request = NSFetchRequest(entityName:"Owner")
request.predicate = NSPredicate(format:"ownerID = %@", ownerIDString)
let result = context.executeFetchRequest(request, error:nil)! as [Owner]
if countElements(result) == 1
let owner = result[0]!
system.owner = owner
【讨论】:
嗯,我知道它就像system.owner=owner
一样简单,但我想我的问题更多是关于检索第二个owner
。我是否执行fetchRequest
然后将该结果分配给system.owner
?像fetchRequest = *insert code* as? Owner
这样的东西然后分配给system.owner
?
是的,完全正确。获取owner
(带有描述唯一属性的谓词,如名称或ID)并分配给系统,如上所示。
感谢您的澄清和代码示例(这与我所拥有的很接近,但并不完全因此我感到困惑)。你对我选择id
作为属性名称是正确的。糟糕的形式!以上是关于在代码中设置关系,在父子节点都插入核心数据之后?的主要内容,如果未能解决你的问题,请参考以下文章