在代码中设置关系,在父子节点都插入核心数据之后?

Posted

技术标签:

【中文标题】在代码中设置关系,在父子节点都插入核心数据之后?【英文标题】:Setting up relationship in the code, after both parent and child are inserted with Core Data? 【发布时间】:2014-11-25 23:58:27 【问题描述】:

我有一个应用程序使用两个实体的核心数据:SystemOwner。每个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 提要不同时可用。

我的问题是,如何在所有对象都存储到磁盘之后使用代码设置SystemOwner 关系?

【问题讨论】:

【参考方案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 作为属性名称是正确的。糟糕的形式!

以上是关于在代码中设置关系,在父子节点都插入核心数据之后?的主要内容,如果未能解决你的问题,请参考以下文章

JPA:在父子关系中->父未更新

在订购应用程序中设置核心数据关系

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

一种定义父子节点关系的方法

Unity3D3D 物体概念 ① ( 轴心点概念 | 物体的父子关系 | 子节点相对坐标 )

从json数据中获取父子关系中所有子节点的总和