2014-08-27 42 views
0

我對如何在覈心數據中創建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對象。目前這種情況正在得到解決,但很快就會導致你的悲傷。

回答

0

減少您的代碼:僅當您需要檢索對象時才設置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