无法在多对多属性中加载核心数据

Can't load Core Data in to-many attribute

我一直无法在一对多中添加和读取核心数据属性 关系。在阅读了许多 SO、Apple Docs 和其他文章后,我仍然有 没有做到这一点。为了做一个简单的测试,我创建了一个标准的Master Detail 带有核心数据的应用程序。这对主要实体没有问题。

核心数据关系如下图。

这是将一些测试数据放入商店的代码。请注意,我是 尝试为每个 InvItem 添加对多数据作为 Set 并使 keywordList 属性可转换。我认为这是最好的方法,但是 显然这在这里不起作用。

func seedInvItems(num : Int) {

    for index in  1...num {

        let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName("InvItem", inManagedObjectContext: kAppDelegate.managedObjectContext) as! InvItem

        newManagedObject.name = "myName\(index)"
        newManagedObject.category1 = "myCategory1x\(index)"
        newManagedObject.compartment = "myCompartment\(index)"
        newManagedObject.entryDate = NSDate()

        //and for the one-to-many relationship
        var myStoreKeywordSet = Set<String>()
        myStoreKeywordSet = ["one","two","three"]

        // do an insert just for grins
        myStoreKeywordSet.insert("four")

        let newManagedObject2 = NSEntityDescription.insertNewObjectForEntityForName("InvItemKeyword", inManagedObjectContext: kAppDelegate.managedObjectContext) as! InvItemKeyword

        newManagedObject2.keywordList = myStoreKeywordSet

    }//for in

    kAppDelegate.saveContext()

    let fetchRequestTest = NSFetchRequest(entityName: "InvItem")
    let sorter : NSSortDescriptor = NSSortDescriptor(key: "name", ascending: true)
    fetchRequestTest.sortDescriptors = [sorter]

    var resultsTest : [InvItem]?

    do {
        resultsTest = try kAppDelegate.managedObjectContext.executeFetchRequest(fetchRequestTest) as? [InvItem]

        for object in resultsTest! {
            let myRetrieveKeywordSet = object.invitemkeywords
            print(myRetrieveKeywordSet)
        }//for in

    } catch let error as NSError {
        //what happens on failure
        print("And the executeFetchRequest error is \(error.localizedDescription)")
    }//do catch

}//seedInvItems

为了完整起见,我确实为核心创建了 NSManagedObject 子类 数据实体。

当 运行 应用程序时,InvItem 的主详细信息按预期运行,但我 不存储对多项目。

这是控制台日志(针对一个 InvItem):

可选(关系 'invitemkeywords' 托管对象 (0x7f985a62bb70) 故障(实体:InvItem;id:0xd0000000000700000;数据:{ 类别 1 = 我的类别 1x3; 隔间=我的隔间3; entryDate = "2016-02-09 02:10:21 +0000"; invitem关键字=“”; 名字=我的名字3; }))

查看数据库,关键字列表没有数据。

如有任何帮助,我们将不胜感激。 Xcode7.2.1IOS9.2

您需要设置从newManagedObjectnewManagedObject2的关系。其实因为是一对多的关系,设置一对一的关系更容易:

newManagedObject2.invitem = newManagedObject

并让 CoreData 处理反向的对多关系。

关于keyWordList没有被填充,不知你的SQL浏览器是否无法解码CoreData的NSSet?我还想知道您是否需要将 keywordList 作为 NSSet?来自 InvItem 的关系已经是一对多关系,因此您的模型暗示每个 InvItem 可以有许多 InvItemKeywords,每个 InvItemKeywords 在其 keywordList 属性中包含许多关键字:是那是你想要的吗?