将本地sqlite文件同步到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 DB的操作:将“事务日志”发送到iCloud,然后构建每个本地sqlite文件。

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

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

方法2:

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

我发现这个方法有很多潜在的问题:

– 有进一步实现的东西来识别记录删除。

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

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

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

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

试试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和方法2似乎都可行。 实际上可能是两者的组合 – 使用iCloud发送一个单独的数据库文件,这是一个数据子集 – 即只是更改了项目。 或者可能是另一种文件格式而不是sqlite db – XML / JSON / CSV等。

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

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

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

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

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

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

咆哮> iCloud开发真的要变得更容易,更稳定! /咆哮