2012-07-19 81 views
10

我需要获取我创建的NSManagedObject类型的唯一标识符。只要对象已经创建,它就需要可用,永不改变,并且是完全独特的。NSManagedObject的唯一标识符

这排除了NSManagedObjectID,因为这可以在上下文保存时更改。如果我的对象具有相同的属性,我相信-hash方法可能是非唯一的。

我真的想避免在实体上创建一个无用的uniqueIdentifier UUID字段,因为这看起来很浪费和混乱。这里有一个公认的最佳实践吗?

+0

你有没有考虑过盐渍哈希? – Jim 2012-07-19 05:06:03

+2

'NSManagedObjectID'将在上下文保存后进行更改,然后该对象将获得最终的'NSManagedObjectID',并且它将不会被更改。你不应该担心存在的ID,甚至没有删除'object',因为没有新的'object'会得到旧的ID。 – holex 2012-07-19 15:59:47

回答

15

尝试NSManagedObjectIDURIRepresentation财产。这是目前NSManagerObject非常独特的ID,但要小心直到NSManagedObject没有保存它给你一个临时ID只有,而不是一个永久的ID,他们可能会不同。 (我只是说,因为我不知道你要使用的唯一的ID是什么以及如何做。)

更新#1

一个假想的唯一ID只是,这是每个人的唯一URL NSManagedObject(如每个文件都有一个唯一的URL),使用它们,你可以找到原来的NSManagedObject,你失去了他们的指针后。我知道这很难理解,但这是NSManagedObjectID及其属性的要点。

(如果你不明白的CoreData及其对象是如何工作的,你就不会downvote的答案。请阅读更多的文档,而不是毫无意义downvoting。)

更新#2

根据@NickLocking评论,我想延长我的回答上面的加粗部分:

直到保存NSManagedObjectContext为新的和尚未保存的NSManagedObject类只有一个临时的唯一ID。他们在第一次保存后会得到永久性的唯一ID。

+1

首次保存对象时,URIR表示发生更改。 – 2012-07-20 03:51:58

0

CoreData自动提供的惟一唯一标识符是对象ID,但正如您所注意到的,它在最初创建后会发生更改。但是你去想出另一种方式来解决此之前,你可能要考虑像定义在管理对象类以下的东西:

- (NSManagedObjectID *)permID { 
    if ([[self objectID] isTemporaryID]) { 
     // Save myself, returning nil if there are errors 
    } 
    return [self objectID]; 
} 

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

+1

这样做的麻烦是,在此实例中保存对象意味着我的应用程序的其他部分检测到已创建一个新对象并对其进行处理。这意味着,例如,一个tableview条目是在没有设置字段的情况下创建的。 – 2012-07-20 03:52:52

3

最终我已经决定没有好的方法来做到这一点,所以我创建了一个uniqueIdentifier字段,将UUID应用于awakeFromInsert。

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