4

我有一个使用 plists 来存储其数据的现有大型应用程序。我在用户默认值中存储指示当前选择的项目、当前用户和各种其他当前选择的应用程序状态。当数据在 plist 中时,这工作得很好。现在我正在重构以使用核心数据而不是 plist。我想将对象实例的引用存储为当前查看的对象。我知道 sqlite 和 Core Data 在数据库中有这个对象的 ID,但我不确定在用户默认值中存储什么。想到三个选项:

  1. 生成我自己的顺序 ID,将其与我想记住的对象一起存储为“当前”,将该 ID 存储在用户默认值中。
  2. 尝试使用 NSManagedObjectID 并存储在用户默认值中。我“认为”我可以将其转换为字符串,如下所示。这行得通吗?

    NSString *stringID = [[[managedObject objectID] URIRepresentation] absoluteString];

  3. 我可以在 Core Data 中创建一个当前状态实体,它是一个单例,只有一行。该实体可能与我要跟踪的当前对象具有一对一的关系。

对于具有最佳设计考虑的方法的建议表示赞赏。

从评论中重复,方法#2的缺点是什么?我在网上阅读了相互冲突的帐户。有人说对象 ID 在迁移中不一致,但 Apple 本身似乎建议将此作为解决方案。

在 NSManagedObjectID 的 Apple 类参考中,他们讨论了这种情况并讨论了将 ID 保存在用户默认值中。它说,“对象 ID 可以转换为 URI 表示形式,以后可以归档和重新创建以引用给定对象(使用 managedObjectIDForURIRepresentation: (NSPersistentStoreCoordinator) 和 objectWithID: (NSManagedObjectContext)。例如,在应用程序可以通过组对象的 ID 存储在用户默认值中。”

这是否意味着对象 ID URI 表示始终保持有效,即使跨迁移也是如此?

4

1 回答 1

2

您应该为您的对象使用您自己的唯一标识符(理想情况下,它不会仅用于此问题的目的),并使用此标识符从 Core Data 检索对象并将此标识符存储在 NSUserDefaults 中。所以,你的 1. 解决方案是正确的,尽管它不需要是顺序的。

3. 解决方案也可以,但不是很干净。

于 2012-04-29T05:20:21.990 回答