在Swift中保存CoreData对多关系

我有一个一对多的关系,看起来像这样,

coredata模型

我已经在一个文件中设置了我的模型类来匹配:

import CoreData import Foundation class Board: NSManagedObject { @NSManaged var boardColor: String @NSManaged var boardCustomBackground: AnyObject? @NSManaged var boardID: String @NSManaged var boardName: String @NSManaged var lists: NSSet } class List: NSManagedObject { @NSManaged var listID: String @NSManaged var listName: String @NSManaged var board: Board } 

因为我从多个JSON端点获取数据,所以我必须从我的板上分别保存我的列表。 我想要做的是创build/更新与boardID匹配的董事会的名单

这是我多次尝试后的地方:

 func saveList(boardID: String, listName: String, listID: String) { let request = NSFetchRequest(entityName: "Board") var error: NSError? = nil request.predicate = NSPredicate(format: "boardID like %@", boardID) let results: NSArray = context.executeFetchRequest(request, error: &error) if results.count > 0 { for result in results { let board = result as Board let list = NSEntityDescription.insertNewObjectForEntityForName("List", inManagedObjectContext: context) as List println("💃 want to save \(listName) in \(board.boardName)") board.lists.addListObject(lists) list.listName = listName list.listID = listID } } } 

基于在Swift和这个 定义CoreData关系的基础上,我试图实现@ Keenle的回答:在一个板子里定义列表对象:

 import Foundation extension Board { func addListObject(value:List) { var items = self.mutableSetValueForKey("lists"); items.addObject(value) } func removeListObject(value:List) { var items = self.mutableSetValueForKey("lists"); items.removeObject(value) } } 

然而,我遇到了以下错误board.lists.addListObject(lists)'NSSet'没有一个名为'addListObject'`的成员

而不是board.lists.addListObject(lists) ,我也尝试board.lists.listName = listName暗示在这个Obj-C的例子 ,但可悲的是也没有工作。

(另外, println输出正确地指定了正确的电路板和列表。)

提前致谢!

在一对多的关系中,更容易设置反向关系的“一对一”方向,在你的情况下

 list.board = board 

所以这里的扩展方法实际上是不需要的。

您应该在board对象上调用addListObject(...)

 board.addListObject(list) // notice that we pass just one object 

另外,如果您希望能够将一组列表添加到特定的board对象,则可以使用接受一组对象的方法来增强您的Board类扩展:

 func addList(values: NSSet) { var items = self.mutableSetValueForKey("lists"); for value in values { items.addObject(value) } } func removeList(values: NSSet) { var items = self.mutableSetValueForKey("lists"); for value in values { items.removeObject(value) } } 

如果你定义:

 @NSManaged var lists: Set<List> 

那你可以这样做:

 board.lists.insert(list)