Cocoa Core Data - 检查具有相同属性的对象是否已存在的最佳实践

时间:2014-11-19 20:35:10

标签: ios objective-c macos core-data swift

我想与您核实在Core Data框架中解决以下任务的最佳实践。在我的模型中,一个对象类型的属性之一必须是唯一的。假设我有对象帐户 - 属性名称必须是唯一的 - 不允许有2个同名帐户。

有两种可能性:

我个人喜欢第二种情况,因为我的验证将在模型中。但问题是此时对象已经插入到上下文中,因此如果我调用fetch,则验证总是失败,因为新对象的名称也会计数(即使仍未永久保存)。但是有一个解决方案。我可以通过创建新的临时托管对象上下文和调用提取

来仅检查永久保存的对象

这是执行此类验证的最佳做法。或者我错过了什么或有更好的方法来做到这一点?

BR Lubos

1 个答案:

答案 0 :(得分:1)

我会用以下方式解决这个问题。一般来说,建议避免多个上下文的复杂性,尽管这也是Apple演示的模式。

创建新的托管对象,将其插入上下文中。检查现有名称。如果名称无效,请提示输入其他名称。重复,直到名称有效。如果用户中断进程或超时,请删除该对象。

如果您可以在保存之前执行此操作,则丢弃对象可能就像调用[context rollback];一样简单。

如果在单独的控制器中执行此操作,则可以在子上下文中执行此操作。如果用户终止该过程,您只需完全丢弃上下文而不保存。

如果您发现名称存在但怀疑它是正在创建的名称,您可以轻松地检查它是否是同一个对象(您已经有了它的引用)。您还可以使用排除此特定对象的谓词进行提取(或更有效地countForFetchRequest)。

NSPredicate(format:"name = %@ && (not self = %@)", account.name, account)