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