无法将核心数据加载到多个属性

时间:2016-02-09 06:49:56

标签: ios core-data one-to-many

我无法在一对多中添加和读取核心数据属性 关系。在阅读了许多SO,Apple Docs和其他文章之后我还有 没有完成这个。为了进行简单的测试,我创建了一个标准的Master Detail 应用核心数据。这对主要实体没有任何问题。

核心数据关系如下所示。 enter image description here

以下是将一些测试数据放入商店的代码。请注意我 尝试将to-many数据添加为每个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

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

运行应用程序时,InvItem的主要细节表现如预期,但我 没有存储多对项目。

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

可选(关系&#39; invitemkeywords&#39;托管对象上的错误(0x7f985a62bb70)(实体:InvItem; id:0xd000000000700000; data:{     category1 = myCategory1x3;     compartment = myCompartment3;     entryDate =&#34; 2016-02-09 02:10:21 + 0000&#34 ;;     invitemkeywords =&#34;&#34 ;;     name = myName3; }))

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

enter image description here

任何帮助将不胜感激。 Xcode 7.2.1 IOS 9.2

1 个答案:

答案 0 :(得分:1)

您需要设置从newManagedObjectnewManagedObject2的关系。事实上,因为这种关系是一对多的,所以设置一对一的关系更容易:

newManagedObject2.invitem = newManagedObject

让CoreData处理逆向对多关系。

至于keyWordList没有被填充,我想知道你的SQL浏览器是否无法解码CoreData的NSSet?我也想知道您是否需要将keywordList作为NSSetInvItem之间的关系已经很多,因此您的模型意味着每个InvItem可以包含多个InvItemKeywords,每个keywordList在其#属性中包含许多关键字:is那是你的意图吗?