我有一个现有的大型应用程序,使用plist来存储其数据。我存储指示当前项目选择的应用程序状态,当前用户以及用户默认值中的各种其他当前选择。当数据在plists中时,这很好用。现在我正在重构使用Core Data而不是plists。我想将对象实例的引用存储为当前查看的对象。我知道sqlite和Core Data在数据库中有这个对象的ID,但是我不确定在用户默认值中存储什么。我想到了三种选择:
尝试使用NSManagedObjectID并存储在用户默认值中。我“想”我可以将它转换为字符串,如下所示。这有用吗?
NSString * stringID = [[[managedObject objectID] URIRepresentation] absoluteString];
我可以在Core Data中创建一个当前状态实体,它是一个单独的行,只有一行。该实体可以与我想要跟踪的当前对象具有一对一的关系。
对于采用最佳设计考虑的方法表示赞赏。
重复评论,方法#2的缺点是什么?我在网上看过有冲突的帐户。有人说对象ID在迁移过程中并不一致,但Apple本身似乎认为这是解决方案。
在NSManagedObjectID的Apple Class Reference中,他们讨论了这种情况,并讨论了如何在用户默认值中保存ID。它说,“对象ID可以转换为URI表示,可以存档并稍后重新创建以引用回给定对象(使用managedObjectIDForURIRepresentation:(NSPersistentStoreCoordinator)和objectWithID :( NSManagedObjectContext)。例如,最后选择的一个组应用程序可以通过组对象的ID存储在用户默认值中。“
这是否意味着对象ID URI表示始终保持有效,即使在迁移过程中也是如此?
答案 0 :(得分:2)
您应该为对象使用您自己的唯一标识符(理想情况下不会仅为此问题提供服务),并使用此标识符从Core Data检索对象并将此标识符存储在NSUserDefaults中。所以,你的1.解决方案是正确的,尽管它不需要是顺序的。
3.解决方案也可以,但它不是很干净。