NSPredicate未执行

Fab*_*oni 8 sqlite core-data nspredicate ios magicalrecord

这很有趣.在我的应用程序中,我在数据库中创建了数千个条目(在另一个线程中,我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

现在我得到的是:

  • 第一个:是一个空数组
  • 第二:包含所有Family对象,如预期的那样
  • 第三:是一个空数组.

通过调试SQL语句,我得到以下内容:

"第一"声明:

CoreData:注释:总获取执行时间:0行为0.0000s.

"第二个"声明":

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连接获取时间:0.0005s

CoreData:注释:总获取执行时间:2行0.0007秒.

"第三"声明:

CoreData:注释:总获取执行时间:0行为0.0000s.

热闹的是我关闭应用程序(我的意思是真的手动终止它)并且我打开它,所有三个"获取"语句都有效.

为什么第一个和第三个fetch语句似乎永远不会被执行?如何深入研究这个问题?

Ott*_*tto 8

我有同样的问题,这是我想出来的,以及我如何解决它.

Magical Record有一个root NSManagedObjectContext作为默认的父级NSManagedObjectContext.当我NSFetchedResultsController在默认上下文中创建一个时,一切似乎都很好,就像你一样.

问题在于所有新人 NSManagedObject都会以他们的临时性回归ObjectID.所以,在我的情况下,我使用an NSPredicate来查询关联表上的查询.我不只是调用关联方法,因为我不想将所有内容加载到内存中,并希望NSFetchedResultsController为我处理更改.

使用临时ObjectID查询找到零结果,这正是它显示的内容.

显然,子上下文(默认)不会获得转换为非临时ID的好处,即使它已被持久保存到后备存储中.

当我试图强迫这个问题时,更糟糕的是发生了obtainPermanentIDsForObjects:error:.Core Data抱怨它无法满足我的实例的错误.没关系,实际上这不是一个错误.简单地刷新对象也没有效果.我怀疑这是一个核心数据错误,几乎没有人发痒,因为他们只是使用关联方法来获取NSSet.

我的修复是使用父上下文NSFetchedResultsController,就像在这个问题,魔法记录,保存和NSFetchedResultsController.

我已经在编辑时将默认值包装在新的子上下文中,因此,将实例复制到该编辑上下文中createInContext,因此除了添加.parentContext参数之外我不需要做任何额外的工作.

顺便说一下,这只发生在关联源的新实例上.一旦一个实例从启动时出现,它就有一个非临时的ObjectID,从来没有问题.