对象之间的核心数据关系

我有一个关于如何在核心数据中创build2个NSObject之间的关系的问题。

首先我有这个CoreData结构。

核心数据

文件和表单之间存在关系。 表单可能有多个文件,但是一个文件只能有一个表单。

我只用Swift创build了NSObjects(所以没有Bridging Header) – 现在有2个核心数据NSObject类:

class Forms: NSManagedObject { @NSManaged var uuid: String @NSManaged var damagenumber: String @NSManaged var internalnumber: String @NSManaged var date: NSDate @NSManaged var name: String @NSManaged var street: String @NSManaged var postalcode: String @NSManaged var city: String @NSManaged var country: String @NSManaged var templateJSON: String @NSManaged var formname: String @NSManaged var files: NSSet } class Files: NSManagedObject { @NSManaged var url: String @NSManaged var forms: Forms } 

我的文件在这里作为NSSet。

所以,我想例如添加一个表单5个文件。 因此,开始这样的事情:

 var request = NSFetchRequest(entityName: "Forms") request.returnsObjectsAsFaults = false; let newFormObject = NSEntityDescription.insertNewObjectForEntityForName("Forms", inManagedObjectContext: context) as Forms newFormObject.setValue(uuid, forKey: "uuid") ...... 

//插入文件

  for index in 0...4 { var request = NSFetchRequest(entityName: "Files") request.returnsObjectsAsFaults = false; let newFileObject = NSEntityDescription.insertNewObjectForEntityForName("Files", inManagedObjectContext: context) as Files newFileObject.setValue(arrFiles[index], forKey: "url") } 

好的一切工作正常。 但是:我如何连接这2个对象? 如果你使用Obj-C NSObject而不是Swift,我有几个方法将一个文件添加到窗体。 但是,我怎样才能在Swift中做到这一点?

如果我有一个关系 – 我如何从一个特定的窗体读取所有的文件对象?

编辑:

我现在改变了行:

 @NSManaged var files: NSSet 

 @NSManaged var files: [Files] 

并在循环中使用:

 newFormObject.files.append(newFileObject) 

这给我带来了以下错误:

***错误:这个进程已经调用了一个NSArray的方法,如initWithArray:,并传入一个NSSet对象。 目前正在进行这项工作,但很快就会令你感到悲伤。

减less你的代码:只有当你需要检索对象时才设置NSFetchRequests。 因此,每次创build新对象时都不需要以下行:

 //Forms var request = NSFetchRequest(entityName: "Forms") request.returnsObjectsAsFaults = false; //Files var request = NSFetchRequest(entityName: "Files") request.returnsObjectsAsFaults = false; 

保持一致:你已经设置NSManagedObject的子类。 所以使用它们,不要使用Key Value Coding。 更换:

 newFormObject.setValue(uuid, forKey: "uuid") 

有:

 newFormObject.uuid = uuid 

题:

我如何连接这2个对象?

在循环结束时,一行代码应该足够了:

 newFileObject.forms = newFormObject // where forms is the name of your relationship 

题:

我如何从一个特定的窗体读取所有的文件对象

当你需要检索某个Form Files objects时,你可以执行一个NSFetchRequest(它允许你设置谓词,sorting等等),或者你可以简单地获得所有相关对象的NSSet,如下所示:

  //Get all Files objects (of a to-many relationship) related to a single Form object let filesSet = myForm.files as NSSet //where myForm is a Form managedObject let filesArray = filesSet.allObjects as Array for obj in filesArray as [Files] { println(obj.url) }