【发布时间】:2012-06-28 02:06:28
【问题描述】:
这很有趣。 在我的应用程序中,我在数据库中创建了数千个条目(在另一个线程中,我使用的是 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;
}
现在我得到的是:
- first:是一个空数组
- 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 = ?按 t0.ZNAME 排序
CoreData:注解:sql连接获取时间:0.0005s
CoreData:注释:总提取执行时间:2 行 0.0007 秒。
“第三”陈述:
CoreData:注释:总提取执行时间:0 行 0.0000 秒。
有趣的是我关闭了应用程序(我的意思是真正手动终止它)然后我打开它,所有三个“获取”语句都起作用了。
为什么第一个和第三个 fetch 语句似乎永远不会被执行?如何深挖问题?
【问题讨论】:
-
我认为基本相同的问题是 NSFetchedResultsController 实现。最近创建的记录没有显示在获取结果中,但是当我直接检查时已写入持久存储 - 正确的计数甚至显示在关系 NSSet 中,但 NSPredicate 没有看到它们。诡异的。使用 MagicalRecord 2 - 以前的项目使用 1.x 版本并且没有问题,所以我可能只是改变路线并使用旧版本。
-
天真(有点离题)的问题:你是如何记录 sql 语句的?我真的很好奇如何在我的应用程序中执行此操作以更好地理解谓词
-
@FelipeSabino 检查stackoverflow.com/questions/6428630/… 和d.pr/i/Lszs
-
@FabianoFrancesconi 太棒了,谢谢!
标签: ios sqlite core-data nspredicate magicalrecord