【发布时间】: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