我想与您核实在Core Data框架中解决以下任务的最佳实践。在我的模型中,一个对象类型的属性之一必须是唯一的。假设我有对象帐户 - 属性名称必须是唯一的 - 不允许有2个同名帐户。
有两种可能性:
我个人喜欢第二种情况,因为我的验证将在模型中。但问题是此时对象已经插入到上下文中,因此如果我调用fetch,则验证总是失败,因为新对象的名称也会计数(即使仍未永久保存)。但是有一个解决方案。我可以通过创建新的临时托管对象上下文和调用提取
来仅检查永久保存的对象这是执行此类验证的最佳做法。或者我错过了什么或有更好的方法来做到这一点?
BR Lubos
答案 0 :(得分:1)
我会用以下方式解决这个问题。一般来说,建议避免多个上下文的复杂性,尽管这也是Apple演示的模式。
创建新的托管对象,将其插入上下文中。检查现有名称。如果名称无效,请提示输入其他名称。重复,直到名称有效。如果用户中断进程或超时,请删除该对象。
如果您可以在保存之前执行此操作,则丢弃对象可能就像调用[context rollback];
一样简单。
如果在单独的控制器中执行此操作,则可以在子上下文中执行此操作。如果用户终止该过程,您只需完全丢弃上下文而不保存。
如果您发现名称存在但怀疑它是正在创建的名称,您可以轻松地检查它是否是同一个对象(您已经有了它的引用)。您还可以使用排除此特定对象的谓词进行提取(或更有效地countForFetchRequest
)。
NSPredicate(format:"name = %@ && (not self = %@)", account.name, account)