我需要为NSManagedObject
我创建的一种类型获取唯一标识符。它需要在创建对象后立即可用,永不更改,并且完全独一无二。
这排除了NSManagedObjectID
, 因为这可以在保存上下文时更改。如果我的对象具有相同的属性,我相信该-hash
方法可能是非唯一的。
我真的很想避免在实体上创建一个否则无用的 uniqueIdentifier UUID 字段,因为这看起来既浪费又混乱。这里有公认的最佳实践吗?
我需要为NSManagedObject
我创建的一种类型获取唯一标识符。它需要在创建对象后立即可用,永不更改,并且完全独一无二。
这排除了NSManagedObjectID
, 因为这可以在保存上下文时更改。如果我的对象具有相同的属性,我相信该-hash
方法可能是非唯一的。
我真的很想避免在实体上创建一个否则无用的 uniqueIdentifier UUID 字段,因为这看起来既浪费又混乱。这里有公认的最佳实践吗?
尝试 的URIRepresentation
属性NSManagedObjectID
。这是当前非常独特的 ID,NSManagerObject
但要小心,直到 NSManagedObject
它没有保存它只给你一个临时 ID,而不是永久 ID,它们可能会有所不同。(我之所以这么说,是因为我不知道您想要什么以及如何使用唯一 ID。)
更新#1
这不仅仅是一个虚构的唯一 ID,这是每个人的纯唯一 URL (就像每个文件都有一个唯一的 URL),使用它们您可以在丢失指针后NSManagedObject
再次找到原始的。NSManagedObject
我知道这很难理解,但这就是 theNSManagedObjectID
及其属性的重点。
(如果您不了解 theCoreData
及其对象的工作原理,则不会对答案投反对票。请阅读更多文档,而不是毫无意义的投反对票。)
更新#2
根据@NickLocking 评论,我将扩展我上面答案的粗体部分:
直到 NSManagedObjectContext
为新的且仍未保存的 NSManagedObject
类保存之前,它只有一个临时的唯一 ID。他们将在第一次保存后获得永久唯一 ID。
最终我决定没有好的方法来做到这一点,所以我只是创建了一个 uniqueIdentifier 字段,我在 awakeFromInsert 上应用了一个 UUID。
保存对象会导致我的应用程序的其他部分,特别是 NSFetchedResultsControllers,在我完成对象之前更新。我简单地尝试了 NSManagedObjectContext 的 gainPermanentObjectIds:withError: 方法,以为它会在不保存上下文的情况下获取对象 ID,但实际上它只是保存了上下文。
CoreData 自动提供的唯一唯一标识符是对象 ID,但正如您所注意到的,它在最初创建后会发生变化。但在您想出另一种解决此问题的方法之前,您可能需要考虑在托管对象类中定义如下内容:
- (NSManagedObjectID *)permID {
if ([[self objectID] isTemporaryID]) {
// Save myself, returning nil if there are errors
}
return [self objectID];
}
这种方法无论如何都不是完美的,特别是如果您需要在对象处于有效状态并且可以保存到数据库之前公开永久 ID。但它允许您以一致的方式公开永久 ID,只要在保存对象之前不需要它即可。