这很有趣。 在我的应用程序中,我在数据库中创建了数千个条目(在另一个线程中,我正在使用MagicalRecord)。一切似乎都很好(从背景/前景/上下文的角度来看)。
当我在主线程中尝试获取“刚插入”的数据时,我发现了以下行为:
- (NSArray *) familiesInCompany:(Company *) company {
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"company == %@", company];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"company.name == %@", company.name];
NSArray *first = [Family MR_findAllSortedBy:@"name" ascending:YES withPredicate:predicate1];
NSArray *second = [Family MR_findAllSortedBy:@"name" ascending:YES withPredicate:predicate2];
NSArray *third = [Family MR_findByAttribute:@"company" withValue:company andOrderBy:@"name" ascending:YES];
return second;
}
现在我得到的是:
Family
个对象通过调试SQL语句,我得到以下内容:
“第一”陈述:
CoreData:注释:总获取执行时间:0行为0.0000秒。
“第二”声明“:
CoreData:sql:SELECT 0,t0.Z_PK,t0.Z_OPT,t0.ZNAME,t0.ZCOMPANY FROM ZFAMILY t0 JOIN ZCOMPANY t1 ON t0.ZCOMPANY = t1.Z_PK WHERE t1.ZNAME =? ORDER BY t0.ZNAME
CoreData:annotation:sql connection fetch time:0.0005s
CoreData:注释:总获取执行时间:2行0.0007秒。
“第三”声明:
CoreData:注释:总获取执行时间:0行为0.0000秒。
热闹的是我关闭应用程序(我的意思是真的手动终止它)并且我打开它,所有三个“提取”语句都有效。
为什么第一个和第三个fetch语句似乎永远不会被执行?如何深入研究这个问题?
答案 0 :(得分:8)
我有同样的问题,这是我想出来的,以及我是如何解决的。
魔法记录的根NSManagedObjectContext
作为默认NSManagedObjectContext
的父级。当我在默认上下文中创建NSFetchedResultsController
时,一切似乎都很好,就像你一样。
问题在于,所有 new NSManagedObject
都会以他们的临时ObjectID
来回复。所以,就我而言,我使用NSPredicate
来查询关联表上的查询。我不只是调用关联方法,因为我不想将所有加载到内存中,并希望NSFetchedResultsController
能够处理更改。
使用临时ObjectID
,查询会找到零结果,而这正是它显示的结果。
显然,子上下文(默认)没有获得转换为非临时ID的好处,即使它已被持久保存到后备存储。
当我试图用obtainPermanentIDsForObjects:error:
强制解决问题时,更糟糕的是发生了。 Core Data抱怨它无法满足我的实例的错误。没关系,实际上这不是一个错误。简单地刷新对象也没有效果。我怀疑这是一个核心数据错误,几乎没有人发痒,因为他们只是使用关联方法来获取NSSet。
我的修复是使用NSFetchedResultsController
的父上下文,就像在这个问题Magical Record, saving, and NSFetchedResultsController中一样。
我在编辑时已将默认值包装在新的子上下文中,因此,使用createInContext
将实例复制到该编辑上下文中,因此除了添加{{{}之外,我不需要做任何额外的工作1}}到论点。
顺便说一句,这只发生在关联来源的新实例上。一旦从启动时出现了一个实例,它就有一个非临时的.parentContext
并且从未遇到过问题。