在Swift中保存CoreData到多个关系

Pir*_*jan 18 macos core-data relationship ios 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
}
Run Code Online (Sandbox Code Playgroud)

因为我从多个JSON端点获取数据,所以我必须单独从我的板上保存我的列表.我想要做的是为具有匹配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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

基于在Swift中定义CoreData关系这个,我尝试实现@Kenlele对板内定义列表对象的答案:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我遇到了以下错误board.lists.addListObject(lists): 'NSSet'没有名为'addListObject'的成员

而不是board.lists.addListObject(lists),我也试图board.lists.listName = listName在这个Obj-C例子中暗示,但遗憾的是也没有用.

(另外,println输出正确指定了正确的板和列表.)

提前致谢!

Mar*_*n R 30

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

list.board = board
Run Code Online (Sandbox Code Playgroud)

所以这里实际上不需要扩展方法.

  • @Pirijan:是的,我已经在你问题的图片中看到过了.Bord-> List是"to-many",List-> Board是"to-one".由于这些是彼此的*逆*关系,因此设置一个会自动更新另一个. - 在这种情况下,设置List-> Board关系会更容易一些. (3认同)

Kee*_*nle 6

你应该调用addListObject(...)board对象:

board.addListObject(list) // notice that we pass just one object
Run Code Online (Sandbox Code Playgroud)

另外,如果您希望能够向特定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)
    }
}
Run Code Online (Sandbox Code Playgroud)