我有一个使用 plists 来存储其数据的现有大型应用程序。我在用户默认值中存储指示当前选择的项目、当前用户和各种其他当前选择的应用程序状态。当数据在 plist 中时,这工作得很好。现在我正在重构以使用核心数据而不是 plist。我想将对象实例的引用存储为当前查看的对象。我知道 sqlite 和 Core Data 在数据库中有这个对象的 ID,但我不确定在用户默认值中存储什么。想到三个选项:
- 生成我自己的顺序 ID,将其与我想记住的对象一起存储为“当前”,将该 ID 存储在用户默认值中。
尝试使用 NSManagedObjectID 并存储在用户默认值中。我“认为”我可以将其转换为字符串,如下所示。这行得通吗?
NSString *stringID = [[[managedObject objectID] URIRepresentation] absoluteString];
我可以在 Core Data 中创建一个当前状态实体,它是一个单例,只有一行。该实体可能与我要跟踪的当前对象具有一对一的关系。
对于具有最佳设计考虑的方法的建议表示赞赏。
从评论中重复,方法#2的缺点是什么?我在网上阅读了相互冲突的帐户。有人说对象 ID 在迁移中不一致,但 Apple 本身似乎建议将此作为解决方案。
在 NSManagedObjectID 的 Apple 类参考中,他们讨论了这种情况并讨论了将 ID 保存在用户默认值中。它说,“对象 ID 可以转换为 URI 表示形式,以后可以归档和重新创建以引用给定对象(使用 managedObjectIDForURIRepresentation: (NSPersistentStoreCoordinator) 和 objectWithID: (NSManagedObjectContext)。例如,在应用程序可以通过组对象的 ID 存储在用户默认值中。”
这是否意味着对象 ID URI 表示始终保持有效,即使跨迁移也是如此?