设置一对多关系后,NSFetchRequest 查询返回 nil

Posted

技术标签:

【中文标题】设置一对多关系后,NSFetchRequest 查询返回 nil【英文标题】:NSFetchRequest query returns nil after setting one to many relationship 【发布时间】:2013-02-28 03:30:23 【问题描述】:

我有两个 NSManagedObject 子类,BookCategory。两者是一对多的关系。

Book 一侧,它有关系categories 连接到Category。反之,Category 通过books 连接到Book

我的应用设置是每次打开应用时从我的服务器下载数据。下载的数据将被遍历并保存在应用程序中。在我的应用程序中,我使用 Magical Record 与 CoreData 进行交互。

Category 数据将首先被下载,然后以 JSON 格式保存:


    "categories" : [
        
            "id" : 1,
            "name" : "Fiction"
        ,
        
            "id" : 2,
            "name" : "Non-fiction"
        
    ]

保存Category没有问题。在应用生命周期的后期,Book 数据将以 JSON 格式保存,如下所示:


    "books" : [
        
            "id" : 1,
            "name" : "Fiction 1",
            "category_id" : 1
        ,
        
            "id" : 2,
            "name" : "Fiction 2",
            "category_id" : 2
        
    ]

当我想将Book 关系分配给Category 时,问题就出现了。我分配关系的代码:

for (NSDictionary *bookInfo in jsonObject[@"books"]) 
    Book *book = [Book createEntity];
    book.identifier = bookInfo[@"id"];
    book.name = bookInfo[@"name"];

    Category *category = [Category findFirstByAttribute:@"identifier" withValue:bookInfo[@"category_id"]];

    book.category = category;

    [[NSManagedObjectContext contextForCurrentThread] saveNestedContexts];

在第一个循环中,bookObject 被成功保存。但是在第二个循环和下一个循环中,Category 不能再被查询了。它返回 nil,尽管 identifier 是相同的。

我确实通过[Category findAll]对所有Category进行了检查,并遍历了所有记录,发现在第二个和下一个循环中仍然存在具有相同id的Category

问题是为什么findFirstByAttribute:withValue: 在第二个循环中检索不到Category

【问题讨论】:

【参考方案1】:

我通过将 MagicalRecord 更新到最新版本 (2.1) 解决了这个问题。

然后我将我的NSManagedObject保存方法从saveNestedContexts修改为新添加的saveUsingCurrentThreadContextWithBlockAndWait

【讨论】:

我刚刚发现saveUsingCurrentThreadContextWithBlockAndWait 在旧的ios 5 设备上工作,而saveWithBlockAndWait 每次都会崩溃。感谢@Willy 的提示。

以上是关于设置一对多关系后,NSFetchRequest 查询返回 nil的主要内容,如果未能解决你的问题,请参考以下文章

根据一对多关系中的属性对 NSFetchRequest 进行排序?

排除某些对象的一对多关系上的 NSFetchRequest 无法按预期工作

用于核心数据一对多关系的 NSSortDescriptor

NSFetchRequest / 谓词问题

在 NSFetchRequest 上设置 2 个 NSPredicates

CoreData 获取所有一对多关系