【问题标题】:iOS Core Data serializationiOS 核心数据序列化
【发布时间】:2013-03-21 02:13:21
【问题描述】:

我正在寻找序列化核心数据对象的集合(可能是 JSON)并且一直在做reading on the subject。我可能会序列化/反序列化 JSON 数据,作为允许 iOS 用户轻松导出和重新导入其数据的一种方式。这可能是在同一设备上备份和恢复,或将数据导入到全新设备上的情况。

此时我的主要问题是如何在导入期间处理现有数据的识别。如果我要重新导入商店中已经存在的对象,我最好更新它们。同样,我想保留任何未单独包含在导入中的现有数据。在这种情况下,最佳做法是什么?我是否应该在创建每个 NSManagedObject 时为其分配一个唯一 ID,并在确定对象是否相等时比较此 ID?

我知道每个 NSManagedObject 都有一个分配给它的 objectID,但我不完全确定我是否可以依赖它,因为导出的数据可以导入到一个完全独立的设备上(其中 objectID 很可能会发生冲突,或者更多很可能,该对象会在创建时被分配一个新的 objectID)。

【问题讨论】:

  • 每个核心数据对象都有一个唯一的 id,一旦对象第一次持久化就不会改变。因此,请确保在将所有对象导出为 JSON 或其他任何内容之前保存上下文,以确保任何瞬态对象都被持久化并获得其唯一 ID。在重新导入时,您可以使用这些 ID 来识别相同的对象。希望这能回答你的问题。因为它有点复杂。被引用的数据和对象可能在此期间发生了变化,被引用的对象可能已经被创建(容易),而被引用的对象可能已经被删除(不是那么容易)。
  • 我不完全确定我是否可以依赖 NSManagedObject 的 objectID,因为导出的数据可以重新导入到一个完全独立的设备上(其中 objectID 很可能会发生冲突,或者更有可能的是,该对象将被分配一个创建时创建新的 objectID)——这就是为什么我要问是否为每个对象生成和维护自己的唯一标识符是否是最佳做法。
  • 好吧,我自己从来没有这样做过。是的,在不同的设备上,ID 可能会发生冲突,尽管考虑到这些 ID 的性质,如果不是不可能的话,这不太可能发生。是的,在创建导入的对象后,将分配一个新 ID。在实际创建新对象之前,您可以检查该 ID 的对象是否已经存在。如果没有,那么您创建一个。如果是,那么您需要处理潜在的更改(也许您只是什么都不做,这取决于业务需求。更困难的是当您导入同时已删除的对象时。

标签: ios objective-c json core-data


【解决方案1】:

在导入过程中如何处理现有数据的识别?

我会为每个项目分配我自己的唯一标识符,以便导入/同步/导出也可以用于其他架构(您可能还需要包含版本信息)。这将允许跨设备识别对象。

导出到其他设备时不能依赖 objectID:

无法创建具有特定对象 ID (see here) 的托管对象,这样就无法避免分配您自己的标识符以用于导入/同步/导出(除非您上传/下载整个DB 文件到其他设备)。

请记住,CoreData 中的唯一(主键)并非微不足道,如果操作不当,可能会影响性能。

【讨论】:

  • 我怀疑可能是这种情况。从一点谷歌搜索this 似乎接近金钱:使用 CFUUID 系列在 MOM 中生成有保证的唯一字符串和索引。这意味着仅在导入数据时确定唯一性(而不是在创建每个 NSManagedObject 期间)。但是您提到了其他潜在的性能影响。想知道这些可能是什么吗?
  • 例如,如果您从服务器获取了许多项目,则有些可能已经存在,有些可能不存在。您不应该尝试一一验证它们的存在,而是收集它们的标识符并一次性获取您已经拥有的东西,更新这些并创建其余部分,然后保存(两次去商店而不是每个项目一次) .
  • 明白了。我以为你指的是可伸缩性。我会将其标记为已回答。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多