在Swift中保存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)