对象之间的核心数据关系
我对如何在核心数据中创建2个NSObject之间的关系有疑问。对象之间的核心数据关系
首先我有这个CoreData结构。
有文件和形式之间的关系。表单可能有多个文件,但一个文件只能有一个表单。
我创建了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
当您需要检索的一定Form
Files 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)
}
感谢您的回复:如果我使用:newFormObject.files = newFileObject编译器告诉我:文件是无法转换为NSSet中 – derdida 2014-08-27 13:19:30
因此改变了我的NSSet为[文件] - 但现在: “文件与Anyobject不同” – derdida 2014-08-27 13:20:50
newFileObj ect.forms = newFormObject; – ggfela 2014-08-27 13:31:59