NSPredicate以排除尚未保存在NSFetchedResultsController中的NSManagedObjects

时间:2010-03-16 02:44:35

标签: iphone objective-c cocoa core-data

this question的基础上,我设法使用撤消组和单个托管对象上下文来处理添加可引用现有Cocktail和/或{{1}的Ingredients }。

现在我被一个UI限制 - 在获取的结果控制器中(按Brands排序)你可以简单地看到要添加的cocktail.name的空行。 Marcus Zarra建议:

  

您可以添加到谓词中以过滤掉未保存的对象,例如使用Cocktail

但我尝试过的每次迭代都会返回错误的格式

  

(entity.isTemporaryID == NO)

如何在Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath entity.isTemporaryID not found in entity <NSSQLEntity Cocktail id=4>'中执行等效的[[cocktail objectID] isTemporaryID]

2 个答案:

答案 0 :(得分:1)

调用是在objectID而不是托管对象:

BOOL isTemporary = [[managedObject objectID] isTemporaryID];

有关详细信息,请参阅Core Data Programming guide的此部分。

我不确定为什么你看到一个未添加实体的空行。如果尚未添加实体,则应由获取的结果控制器获取该实体。听起来您已将实体插入上下文但尚未填充它。

如果是这种情况,您可以使用谓词来排除部分或全部属性为空的实体。如果您最终执行此操作,您可能希望向该类添加一个标志属性,如果实体未处于要显示的状态,则该属性将返回NO(通过自定义getter)。

答案 1 :(得分:0)

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath entity.isTemporaryID not found in entity <NSSQLEntity Cocktail id=4>'
     

如何在NSPredicate中执行等效的[[cocktail objectID] isTemporaryID]?

那样做。

您要求的不是[[cocktail objectID] isTemporaryID],而是[[cocktail entity] isTemporaryID]。如果你想要objectID(你这样做,因为你想问它是否是一个临时ID),那么你需要在你的关键路径中提出要求。

您应该阅读Key-Value Coding Programming Guide,即使您已经阅读过,也可以在entity中查找objectIDthe NSManagedObject reference方法。从这些中你可以清楚地看到Marcus Zarra要么将两者混合起来要么objectID,而是偶然输入entity。它发生在每个人身上 - 这就是为什么总是检查文档是好的。