NSFetchRequest有时候不会返回任何东西,但我可以找到它

时间:2014-07-28 22:23:20

标签: ios core-data nspredicate nsfetchrequest

我有NSFetchRequest我创建NSFetchedResultsController的一部分。谓词旨在查找与其他3个对象有关系的特定对象:

    [NSPredicate predicateWithFormat:@"%K = %@ && %K = %@ && %K = %@ && (delete == null || delete == 0)",
                 CDPerformanceDataRelationships.group, group,
                 CDPerformanceDataRelationships.game, game,
                 CDPerformanceDataRelationships.user, user]

这一切看起来都正确,除了获取请求并不总是返回一个对象(在这种情况下应该只返回一个对象)。它大部分时间都有,但有时会返回一个空数组。

我手动跟踪所有Core Data对象中的关系,以便于同步到服务器。所以我可以更改谓词以搜索获取请求的相应ID:

[NSPredicate predicateWithFormat:@"%K = %@ && %K = %@ && %K = %@ && (delete == null || delete == 0)",
             CDPerformanceDataAttributes.groupID, group.groupID,
             CDPerformanceDataAttributes.gameID, game.gameID,
             CDPerformanceDataAttributes.userID, user.userID]

令人沮丧的是,上面的提取实际上返回的对象具有我在之前提取中寻找的确切关系。

有人知道为什么会这样吗?

更新

我使用Mogenerator创建我的核心数据NSManagedObject子类。 Mogenerator创建一个枚举(NSString),其中包含类的属性和关系。因此CDPerformanceDataRelationships.<property>解析为字符串,该字符串是相关特定关系的关键路径。 CDPerformanceDataAttributes.<property>解析为特定属性的字符串。

所有这些都是在主线程上完成的。虽然我在后台线程上有其他上下文,但它们在类中是自包含的,并且在类外无法访问。

此外,我将实体名称谓词和排序描述符传递给构造Fetch请求和NSFetchedResultsController的通用私有类方法。有大约十几个其他方法使用它来构造Fetch Requests和NSFetchedResultsController没有任何问题。

更多信息

已删除的对象
我有一个名为&#34;删除&#34;的布尔属性在我的所有Core Data对象上。我将对象标记为需要删除并在提取期间将其过滤掉。当应用程序首次启动时,我会获取这些对象并删除它们,然后应用程序的其余部分才有机会使用它们。这是我唯一一次从Core Data中删除对象。这就是您看到(delete == null || delete == 0)

的原因

对象类型
以ID结尾的所有属性均为NSNumber。您看到的所有其他属性(组,游戏,用户)都是核心数据对象,是NSManagedObject的子类。 Core Data对象确实有自己的<object>id(例如:gameID)属性,该属性与检索到的对象上的相关属性相匹配。失败的获取请求正在寻找与其他核心数据对象具有特定关系的对象。成功的获取请求正在寻找核心数据对象(ID)上的属性。

没有重复
我检查了返回的对象中相关核心数据对象的内存地址。他们匹配,指针平等。意思是object.group == groupobject.game == game

0 个答案:

没有答案