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

时间:2012-04-29 05:05:13

标签: ios core-data nsuserdefaults

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

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

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

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

  4. 对于采用最佳设计考虑的方法表示赞赏。

    重复评论,方法#2的缺点是什么?我在网上看过有冲突的帐户。有人说对象ID在迁移过程中并不一致,但Apple本身似乎认为这是解决方案。

    在NSManagedObjectID的Apple Class Reference中,他们讨论了这种情况,并讨论了如何在用户默认值中保存ID。它说,“对象ID可以转换为URI表示,可以存档并稍后重新创建以引用回给定对象(使用managedObjectIDForURIRepresentation:(NSPersistentStoreCoordinator)和objectWithID :( NSManagedObjectContext)。例如,最后选择的一个组应用程序可以通过组对象的ID存储在用户默认值中。“

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

1 个答案:

答案 0 :(得分:2)

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

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