2011-11-15 83 views
18

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

现在,我试图想出通过iCloud同步此文件的最佳方法。我知道你不能直接同步它,原因很多。我知道CoreData能够同步其数据库,但即使忽略使用CD本质上也会将此文件锁定到Apple平台(我认为?我只看了一下CD),我需要iCloud同步此文件以跨越所有iCloud的支持平台 - 应该包括Windows。我必须假定Windows API中的CoreData文件不会有任何兼容性。如果苹果公司告诉我们任何其他更多的信息,那么规划出最好的方法将会容易得多。“最终会有一个Windows API”

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

由于这些原因,我不认为CoreData可以帮助我做到这一点。我是否认为这是正确的?

从那里开始,我需要为此设计一个算法,或者找到现有的或现有的第三方解决方案。我还没有偶然发现任何东西。不过,我一直在思索了几个可能的方法,我可以实现:

方法1:

做类似的东西CoreData如何同步源码DBS:发送“事务日志”到iCloud,而不是和构建每个本地SQLite文件关闭这些。

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

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

方法2:

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

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

- 具备实现的东西进一步认识到记录删除。

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

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

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

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

回答

3

尝试从雷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

我觉得这是很复杂的,但对我帮助很大。

+2

这些仅用于传输文件(iCloud也可以)。我遇到的问题是将更改镜像到多个设备上存在的数据库文件。我不能仅将一个副本复制到其他设备,因为每个设备上的版本可能有独特的更改。无论如何,我最终实施了“方法1”,目前工作正常...... – JDR

1

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

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

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

0

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

Sooo。我必须使用事务日志方法。这确实很难实施,但一旦到位,似乎就没问题。

我正在使用Apple的SharedCoreData样本作为此作品的基础。此链接需要Apple开发人员帐户。

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

rant> iCloud开发真的要变得更轻松,更稳定!/rant