设置一对多关系后,NSFetchRequest 查询返回 nil
Posted
技术标签:
【中文标题】设置一对多关系后,NSFetchRequest 查询返回 nil【英文标题】:NSFetchRequest query returns nil after setting one to many relationship 【发布时间】:2013-02-28 03:30:23 【问题描述】:我有两个 NSManagedObject
子类,Book
和 Category
。两者是一对多的关系。
在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 无法按预期工作