将核心数据对象保存在多个商店中

时间:2012-09-04 05:23:38

标签: ios core-data synchronization nspersistentstore

我正在使用Core Data开发iOS应用程序。我希望持久性存储位于共享位置,例如网络驱动器,以便多个用户可以处理数据(在不同时间,即并发不是问题的一部分)。

但我也想提供处理“离线”数据的能力,即通过在iPad上保留本地持久性商店。到目前为止,我读到我可以通过使用持久性存储协调器的迁移功能在某种程度上做到这一点,但这似乎暗示旧存储随后失效。此外,我不一定希望将整个商店“离线”移动,而只是将其作为其中的一部分:与Apple提供的简单“公司部门”示例一致,我希望用户能够查看一个部门,与该部门相关的所有员工(以及与每个员工相关的所有属性)。然后,用户可以在iPad上本地处理部门数据,并在一段时间后将这些更改同步回服务器的持久存储。

所以,我需要的是将核心数据对象从一个商店复制到另一个商店,以及通过关系引用的所有对象。并且这个复制过程还需要确保如果一个对象已经存在于目标持久存储中,那么它被覆盖而不是添加到存储中的新对象(我已经因为其他原因而给每个对象一个UID,所以我也许能够重新使用UID。)

从目前为止我所看到的,看起来没有简单的方法来同步或复制Core Data持久存储,这是一个公平的评估吗?

所以我真的需要编写一段执行以下操作的代码:

  • 通过MOC检索对象“A”
  • 检索所有实体中与对象“A”
  • 有关系的所有对象
  • 为目标持久存储实例化新的MOC
  • 对于检索到的每个对象,检查目标存储是否存在对象
  • 如果对象存在,则使用步骤1和步骤1中检索到的对象的属性覆盖它。 2
  • 如果对象不存在,则创建它并根据步骤1和步骤1中检索到的对象设置所有属性。 2

虽然这不是世界上最复杂的事情,但我仍然认为这种“在线/离线编辑”的要求是足够普遍的,因为某些标准功能可用于同步持久存储的部分?

您的观点非常感谢, 谢谢, da_h人

3 个答案:

答案 0 :(得分:0)

我上面的评论只是半开玩笑。你真的在描述一个非常难的问题 - 很难确定这种同步,而且在任何开发环境中,很少会成为一个“正常工作”的交钥匙解决方案。我认为上面的伪代码描述非常准确地描述了您需要做什么。虽然可以推广遍历关系和检查现有对象的一些工作,但是您正在讨论一些可能复杂的异常处理情况 - 例如,如果更新对象,并且只有1个相关对象中的1个以某种方式过时,你丢弃更新或应用它的一部分?您说“并发”不是问题的一部分,但如果多个用户可以同时“检出”对象,除非您计划对这些对象设置锁定机制,否则在尝试进行更新时会出现冲突。

要检查的是Core Data中用于利用iCloud的新功能 - 我怀疑这会对您的问题有所帮助,但它通常是相关的。

由于您希望在网络中使用您的数据,因此需要考虑的另一件事是核心数据是否适合您的问题。由于Core Data是一种非常适合支持UI和MVC模式的技术,如果您的数据需求不是特别绑定到UI,您可以考虑使用其他类型的数据库解决方案。

如果您实际上在重要的方面利用Core Data而不仅仅是建模,在推动您的UI方面,并且您希望坚持使用它,我认为您的分析是正确的:您将不得不滚动你自己的解决方案我认为构建和测试将是一件非常重要的事情。

要考虑的选项是CouchDB和名为TouchDB的iOS实现。这意味着对你的问题采用更多面向文档的(JSON)方法,根据你所描述的内容,这可能是合适的。

答案 1 :(得分:0)

从目前为止我所看到的,我认为最好的方法是RestKit。它提供了一个Core Data包装器,它使用JSON在远程和本地存储之间移动数据。我还没有完全尝试过,但从文档中读到的内容来看,它听起来非常强大,非常适合我的需求。

答案 2 :(得分:0)

你肯定会检查这些事情:

Parse.com - 基于云的数据存储

PFIncrementalStore https://github.com/sbonami/PFIncrementalStore - NSIncrementalStore的子类,它允许您的持久存储协调器同时在本地和远程(在Parse Cloud上)存储数据

所有这些都有详细记录。此外,Parse.com将发布iOS本地数据存储SDK http://blog.parse.com/2014/04/30/take-your-app-offline-with-parse-local-datastore/,它将帮助您保持数据同步。