0

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

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

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

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

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

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

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

非常感谢您的观点,谢谢,da_h-man

4

3 回答 3

0

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

于 2012-09-15T14:17:42.773 回答
0

你绝对应该检查这些事情:

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

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

所有这些东西都有据可查。Parse.com 还将发布 iOS 本地数据存储 SDK http://blog.parse.com/2014/04/30/take-your-app-offline-with-parse-local-datastore/这将有助于保持您的数据已同步。

于 2014-05-14T11:14:50.633 回答
0

我对上面的评论只是半开玩笑。您确实在描述一个非常困难的问题 - 很难确定这种同步,而且在任何开发环境中,很少有会成为“正常工作”的交钥匙解决方案。我认为您上面的伪代码描述非常准确地描述了您需要做什么。尽管可以概括一些遍历关系和检查现有对象的工作,但您谈论的是一些潜在复杂的异常处理情况 - 例如,如果更新一个对象,并且只有 5 个相关对象中的 1 个在某种程度上已过时,您是丢弃更新还是应用部分更新?您说“并发”不是问题的一部分,但是如果多个用户可以“签出”

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

既然你想带着你的数据上网,另一件要考虑的事情是 Core Data 是否适合你的问题。由于 Core Data 在很大程度上是一种旨在支持 UI 和 MVC 模式的技术,如果您的数据需求不是特别绑定到 UI,您可能会考虑另一种类型的 DB 解决方案。

如果您实际上以超越建模的重要方式利用 Core Data,在驱动您的 UI 方面,并且您想坚持使用它,我认为您的分析是正确的:您将不得不推出自己的解决方案. 我认为构建和测试将是一件不平凡的事情。

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

于 2012-09-04T07:26:25.287 回答