我有一个核心数据导入程序循环数据,并在导入过程中忽略重复记录。
但我发现我的NSFetchRequest与最近存储的尚未保存的记录不匹配。而且我看到看似相同的查询会产生不同的意外结果。
例如,在我的测试中,我发现此查询匹配并返回结果:
fetchTest.predicate = [NSPredicate predicateWithFormat:@"%K = 3882", @"intEmployee_id"];
但这个看似相同的不是:
fetchTest.predicate = [NSPredicate predicateWithFormat:@"%K = %@", @"intEmployee_id", @"3882"];
但是 - 在将上下文保存到持久存储之后,它们都匹配相同。
Apple的文档说默认情况下提取应该可以对待挂起的更改,实际上我已经确定[fetchTest includesPendingChanges] = YES。
这里到底发生了什么想法?这两个抓取器返回不同结果的可能性如何?
答案 0 :(得分:1)
也许员工ID不是字符串而是数字?然后谓词应该是:
[NSPredicate predicateWithFormat:@"%K = %@", @"intEmployee_id",
[NSNumber numberWithInt:3882]];
这意味着不稳定的行为来自混合类型。它仍然以某种方式工作,即使是不正常的,因为在SQLite文档中,它表示在物理存储数据时,SQLite实际上并没有真正区分类型。
请参阅SQLite网站上的Distinctive Features of SQLite,标题为 Manifest Typing 。
答案 1 :(得分:1)
这些实际上并没有评估到相同的值。
[NSPredicate predicateWithFormat:@"%K = 3882", @"intEmployee_id"]
在
时评估为intEmployee_id = 3882
[NSPredicate predicateWithFormat:@"%K = %@", @"intEmployee_id", @"3882"]
评估为intEmployee_id = "3882"
尝试使用数字而不是字符串作为id。