ios – NSUserDefaults与应用程序状态的核心数据

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

>生成我自己的顺序ID,将我想要记住的对象存储为“当前”,将该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表示始终保持有效,即使在迁移期间也是如此?

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

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

点赞