core-data - NSManagedObject的唯一标识符

  显示原文与译文双语对照的内容
0 0

我需要为我创建的NSManagedObject 类型获取一个唯一的标识符。 它需要在创建对象后立即可用,永远不会改变,并且是完全唯一的。

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

我很想避免在实体上创建其他无用的uniqueIdentifier UUID字段,因为这似乎是浪费和混乱的。 这里是否有公认的最佳实践?

时间: 原作者:

0 0

尝试 NSManagedObjectIDURIRepresentation 属性。 这是非常独特的id为当前 NSManagerObject 但小心直到NSManagedObject不是救了这只给你一个临时id,不是永久的,他们可能有所不同。 ( 我只是说,因为我不知道什么以及怎样使用唯一的标识。)

更新 #1

这个不是一个虚构的惟一的id,这是独特的url为每个单独的NSManagedObject ( 就像每个文件都有一个唯一的网址), 再次使用它们你可以找到原始 NSManagedObject, 之后失去了指针。 我知道这很难理解,但这是 NSManagedObjectID 和它的特性。

( 如果你不理解 CoreData 和他们的对象的工作方式,你就不会downvote的答案) 。 请阅读更多文档,而不是 pointless downvoting 。)

更新 #2

根据 @NickLocking 注释,我将扩展上述答案的粗体部分:

直到拯救NSManagedObjectContext新和仍未保存的NSManagedObject类只有一个临时的惟一id。 首次保存后,它们将得到永久唯一标识。

原作者:
0 0

最终我决定没有好的方法来做这个,所以我刚创建了一个uniqueIdentifier字段,我在awakeFromInsert上应用了一个 UUID 。

保存对象使应用程序的其他部分( 特别是 NSFetchedResultsControllers ) 在完成对象之前更新。 我简单地尝试了NSManagedObjectContext的obtainPermanentObjectIds:withError: 方法,它将获得不保存上下文的对象 IDs,但实际上它只是保存上下文。

原作者:
0 0

由CoreData自动提供的惟一惟一标识符是对象 ID,但是你已经注意到它在初始创建之后将会改变。 但是,在使用其他方法来解决这里问题之前,你可能需要考虑在托管对象类中定义如下内容:


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

这种方法并非完全是完美的,特别是当你需要在对象处于有效状态之前公开永久标识,并且可以保存到数据库中。 但它将允许你以一致的方式公开永久标识,只要在对象可以保存之前不需要它。

原作者:
...