NSManagedObject的唯一标识符

10
我需要获取我所创建的NSManagedObject类型的唯一标识符,并且它需要在对象创建后立即可用,永远不会改变,且完全唯一。
这将排除NSManagedObjectID,因为当上下文被保存时,其可能会发生更改。如果我的对象具有相同的属性,则-hash方法可能是不唯一的。
我真的想避免在实体上创建一个无用的uniqueIdentifier UUID字段,因为这似乎是浪费和混乱的。这里是否有公认的最佳做法?

你考虑过盐哈希吗? - Jim
2
NSManagedObjectID 在上下文的 第一次 保存后将会改变,然后对象将获得最终的 NSManagedObjectID,它将永远不会再改变。因此,您不必担心现有的 ID,即使您删除了 object,也不会有新的 object 获得旧的 ID。 - holex
3个回答

13
尝试使用NSManagedObjectIDURIRepresentation 属性。这是当前NSManagerObject的非常独特的 ID,但要小心,只有在NSManagedObject被保存之前,它才会给你一个暂时的 ID,而不是永久的ID,并且它们可能会不同。(我只是说因为我不知道你想要如何使用这个唯一的ID。)
更新1: 这不仅仅是想象中的唯一ID,而是每个单独的NSManagedObject都有纯粹的唯一URL(就像每个文件都有唯一的URL一样),使用它们可以在失去指针后重新找到原始的NSManagedObject。我知道很难理解,但这就是NSManagedObjectID及其属性的重点。
(如果您不了解CoreData及其对象的工作原理,您将不会对回答进行负面评价。请阅读更多文档,而不是毫无意义地进行负面评价。)
更新2: 根据@NickLocking的评论,我将扩展我的回答中的粗体部分: 直到为新的、仍未保存的NSManagedObject类保存NSManagedObjectContext之前,它们只有一个临时的唯一ID。他们将在第一次保存后获得永久唯一ID。

2
当对象首次保存时,URIRepresentation会发生变化。 - Nick Locking

3

最终我决定没有好方法来完成这件事,所以我创建了一个uniqueIdentifier字段,在awakeFromInsert方法中应用UUID。

保存对象会导致我的应用程序的其他部分,特别是NSFetchedResultsController,在我完成对象之前更新。我曾尝试过NSManagedObjectContext的obtainPermanentObjectIds:withError:方法,认为它可以在不保存上下文的情况下获取对象ID,但实际上它只是简单地保存上下文。


1
CoreData 自动提供的唯一标识符仅为对象 ID,但正如您所指出的那样,在初始创建后它将发生变化。但在您开始想出另一种解决方法之前,您可能需要考虑在托管对象类中定义以下内容:
- (NSManagedObjectID *)permID {
    if ([[self objectID] isTemporaryID]) {
        // Save myself, returning nil if there are errors
    }
    return [self objectID];
}

这种方法并不完美,尤其是如果您需要在对象处于有效状态且可以保存到数据库之前公开永久ID。但只要您不需要在对象可以保存之前使用它,它就可以让您以一致的方式公开永久ID。

1
问题在于,保存该对象意味着应用程序的其他部分会检测到已创建新对象并对其进行处理。例如,这意味着将创建一个表格视图条目,但未设置任何字段。 - Nick Locking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接