将本地sqlite文件同步到iCloud

时间:2011-11-15 23:57:54

标签: ios sqlite core-data synchronization icloud

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

现在,我正试图想出通过iCloud同步此文件的最佳方法。我知道你不能直接同步它,原因有很多。我知道CoreData能够同步它的数据库,但是甚至忽略使用CD本质上会将这个文件锁定到Apple平台(我想?我只看了一下CD),我需要这个文件的iCloud同步才能工作所有iCloud支持的平台 - 应该包括Windows。我必须假设Windows API中的CoreData文件没有任何兼容性。如果Apple告诉我们的不仅仅是“将会有一个Windows API [最终?]”

,那么计划实现这一目标的最佳方法将会容易得多。

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

由于这些原因,我认为CoreData不能帮助我解决这个问题。我是否正确地想到这一点?

从那里开始,我需要为此设计算法,或找到现有的或现有的第三方解决方案。我还没有发现任何事情。但是,我一直在考虑我可以实现的几种可能的方法:

方法1:

执行类似于CoreData同步sqlite数据库的操作:将“事务日志”发送到iCloud,然后构建每个本地sqlite文件。

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

一旦这些文件变大,事情就会变得有趣'有趣',但这似乎是一个可解决的问题。

方法2:

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

我发现这种方法存在许多潜在的问题:

- 要进一步实现识别记录删除的内容。

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

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

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

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

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:1)

方法1和方法2似乎都可行。实际上可能是两者的组合 - 使用iCloud发送作为数据子集的单独数据库文件 - 即仅更改项目。或者也许是另一种文件格式而不是sqlite db - XML / JSON / CSV等。

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

显然,这取决于您希望同步多少数据和设备数量,以及您是否有权访问适当的服务器和/或预算以涵盖运行此类服务器。 iCloud将为#34; free"但它真正做的就是传输文件。自定义解决方案允许您根据需要定义同步模型,但您必须开发和管理它并为其付费。

答案 2 :(得分:0)

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

的sooo。我不得不使用事务日志方法。它实际上很难实现,但一旦到位,似乎没问题。

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

我确实从Tim Roadley找到了更好的解决方案但是这只适用于IOS,我需要IOS和MacOS。

咆哮> iCloud开发必须变得更容易,更稳定! /咆哮