对象之间的核心数据关系

问题描述:

我对如何在核心数据中创建2个NSObject之间的关系有疑问。对象之间的核心数据关系

首先我有这个CoreData结构。

Core Data

有文件和形式之间的关系。表单可能有多个文件,但一个文件只能有一个表单。

我创建了NSObjects只有斯威夫特(所以没有桥接报头) - 现在有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个文件。所以像这样的东西startet:

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对象。目前这种情况正在得到解决,但很快就会导致你的悲伤。

减少您的代码:仅当您需要检索对象时才设置NSFetchRequests。因此,你不需要以下行每次创建新的对象:

//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 

问:

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

How do i connect this 2 Objects?

一个单一的代码行应该在你的循环结束足够

问:

how do i read all File Objects from a certain Form

当您需要检索的一定FormFiles objects,您可以执行NSFetchRequest(即允许您设置谓词,排序等等),或者你可以简单地得到所有的的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) 
    } 
+0

感谢您的回复:如果我使用:newFormObject.files = newFileObject编译器告诉我:文件是无法转换为NSSet中 – derdida 2014-08-27 13:19:30

+0

因此改变了我的NSSet为[文件] - 但现在: “文件与Anyobject不同” – derdida 2014-08-27 13:20:50

+0

newFileObj ect.forms = newFormObject; – ggfela 2014-08-27 13:31:59