在使用Core Data插入父级和子级之后,在代码中设置关系?

时间:2014-11-25 23:58:28

标签: core-data swift

我有一个使用两个实体的核心数据的应用:SystemOwner。每个System都有一个Owner,每个Owner都可以拥有SystemJSON许多GET个对象。两个对象都是从远程Owner Feed中相互独立收集的。我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对象看起来像这样(部分自动生成):

System

我无法同时创建这些对象,因为System JSON Feed可能与Owner JSON Feed同时不可用。

我的问题是,在所有对象存储到磁盘后,如何使用代码设置此{{1}}< - {{1}}关系?

1 个答案:

答案 0 :(得分:1)

这不可能更直观:

system.owner = owner;

其中第一个owner是关系名称,第二个是检索到的所有者对象。

BTW:看看你的模型文件,你似乎忘记了从所有者到系统的反向关系。也许您在完成模型设计之前生成了托管对象子类。

另外,我建议为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
}