19

我将一些数据直接存储在我的 iOS 应用程序中的本地 .sqlite 文件中。我选择这样做而不是 CoreData,因为数据需要与非 Apple 平台兼容。

现在,我正在尝试想出通过 iCloud 同步此文件的最佳方式。我知道您无法直接同步它,原因有很多。我知道 CoreData 能够同步其数据库,但即使忽略使用 CD 本质上会将这个文件锁定到 Apple 平台(我认为?我只研究过 CD 一点),我需要这个文件的 iCloud 同步才能工作iCloud 支持的所有平台——应该包括 Windows。我必须假设 Windows API 中的 CoreData 文件不会有任何兼容性。如果 Apple 告诉我们的不仅仅是“将会有一个 Windows API [最终?]”,那么计划出实现这一目标的最佳方法会容易得多。

此外,我最终还需要实现至少一项同步服务来支持 iCloud 不支持的平台。如果我用于 iCloud 的方法可以大部分用于未来的服务,这将是有帮助的,尽管不是必需的。

由于这些原因,我认为 CoreData 无法帮助我解决这个问题。我这样想对吗?

从那里继续,我需要为此设计一个算法,或者找到一个现有的或现有的第 3 方解决方案。我还没有偶然发现任何东西。但是,我一直在考虑可以实现的几种可能的方法:

方法一:

做一些类似于 CoreData 如何同步 sqlite DB 的事情:将“事务日志”发送到 iCloud,然后从这些文件中构建每个本地 sqlite 文件。

我认为每个设备都会发送一个(唯一命名的)文本文件,其中列出了该设备执行的所有 sql 命令以及时间戳。该设备将存储它已执行的每个命令列表中的距离,并在每次更新文件时从该点继续。如果它一次接收到多个日志文件的更新,它将按时间戳顺序执行每个命令。

一旦这些文件变大,事情可能会在效率方面变得“有趣”,但这似乎是一个可以解决的问题。  

方法二:

定期将工作数据库的副本同步到 iCloud。在每条记录中都有一个修改时间戳字段。当更新的数据库副本通过时,查询所有时间戳比某个参考时间更新的记录,并根据新数据更新本地数据库中的记录。

我看到这种方法有很多潜在的问题:

- 必须进一步实施以识别记录删除。

- 数据库文件可能会发生冲突。可以通过按时间戳顺序处理每个冲突版本来处理它们。

- 确定检查每个更新的日期可能很棘手,因为这取决于更新来自哪个设备。

方法2有很多潜在的问题,但方法1对我来说似乎可行......

有没有人对什么可能是最好的行动方案有任何建议?有什么比我的“方法 1”更好的想法(或它不起作用的原因)?

4

3 回答 3

3

试试 Ray Wenderlich 的这两种解决方案:

通过邮件导出/导入数据: http ://www.raywenderlich.com/1980/how-to-import-and-export-app-data-via-email-in-your-ios-app

与 iTunes 共享文件: http ://www.raywenderlich.com/1948/how-integrate-itunes-file-sharing-with-your-ios-app

我发现它很复杂,但对我帮助很大。

于 2011-11-28T20:34:12.030 回答
1

方法一和方法二似乎都可行。实际上可能是两者的结合——使用 iCloud 发送一个单独的数据库文件,该文件是数据的子集——即只是更改了项目。或者可能是另一种文件格式而不是 sqlite db - XML/JSON/CSV 等。

另一种选择是在 iCloud 之外进行 - 即用于同步的简单自定义 Web 服务。因此,每个更改都通过 HTTP 上的 JSON/XML 提交到中央服务器,然后其他设备从中提取更新。

显然,这取决于您要同步多少数据和多少设备,以及您是否有权访问适当的服务器和/或预算来覆盖运行这样的服务器。iCloud 将“免费”做到这一点,但它真正做的只是传输文件。自定义解决方案允许您根据需要定义同步模型,但您必须开发和管理它并为此付费。

于 2012-02-16T15:13:56.847 回答
0

我考虑过通过 iCloud 传输数据库文件的可能性,但我认为如果应用程序同时在多个设备上运行,我会遇到经典的时间问题 - 用户启动缓慢 - 并且数据库损坏。(例如 iPad/iPhone)。

太棒了 我不得不使用事务日志方法。确实很难实施,但是一旦到位,似乎还可以。

我使用 Apple 的SharedCoreData示例作为这项工作的基础。此链接需要 Apple 开发者帐户。

我确实从Tim Roadley 那里找到了一个更好的解决方案,但这仅适用于 IOS,而且我需要 IOS 和 MacOS。

rant> iCloud 开发真的必须变得更容易和更稳定!/咆哮

于 2012-11-16T04:33:29.070 回答