iPhone(iOS)应用程序使用本地sqlite并希望在多个设备之间同步

我有一个iPhone(iOS)应用程序,可以将数据保存在每个设备上的本地SQLite数据库中。 该应用程序用于管理孩子的虚拟银行帐户,以跟踪他们的津贴,支出,储蓄等(KidsBank和KidsBank Free)。 我收到了很多家长的要求,要求父母之间甚至可能是他们孩子的iOS设备之间提供同步function。

我考虑了几个选项,但所有选项都很乏味且非常重要,因为这基本上需要数据库复制或新架构。 理想情况下,任何设备上的任何事务都应该出现(同步)到系列中的所有设备(尽可能立即)。

理想情况下,我希望同步是自动和手动

选项包括(1)使用iCloud(2)使用设备之间的直接网络连接(wifi)(3)使用服务器端数据库和Web服务(JSON / RESTFul)

(1)iCloud PRO:iCloud提供分布式文件同步CON:需要iOS 5,SQLite数据库文件无法通过iCloud同步,经典数据库复制(和非平凡)

使用iCloud是一个很好的考虑因素。 设备可以将自定义事务日志写入iCloud文件,其中每个设备都有一个文件,该文件由唯一的设备ID标识。 全局唯一ID(GID)和最后更改时间戳将添加到每个表中。 所有参与的设备都会将唯一的设备ID写入iCloud中的单独文件。 在应用程序启动或更改日志文件后,在特定设备上运行的应用程序将通过iCloud从文件加载所有事务,但不加载在自己设备上生成的事务。 加载事务的最后一个参与设备将从文件中删除该事务。 如果设备不是最后一个参与设备,它只需在交易上签名并允许文件通过iCloud进行同步。 可能有更好的算法,但基本思路是相同的 – 使用iCloud来推动变更日志。

(2)直接wifi连接将允许两个设备手动进行同步。 PRO:管理同步过程并不复杂CON:用户必须选择在wifi连接时从他们的应用程序同步

(3)移动整个数据库或管理服务器上的事务。 专业版:不再需要同步CON:网络驱动应用的典型问题。 需要重写数据库服务层(目前在​​SQL中)才能使用远程Web服务。 运行服务器的成本(我会使用AWS)。

任何人都可以提供一些在多个设备之间同步SQLite的经验吗? 我倾向于使用iCloud来推动事务日志。 我正在努力降低成本和复杂性。

迁移到iCloud可能是最好的解决方案,因为Apple已经certificate并制作了它。 你不需要担心iOS 5的要求,因为大多数统计数据都超过90%使用它。 iOS 5可以免费升级到。 然后,您可以将旧版本重命名为Lite,并在不同步的情况下继续。

同步可能是你做的最难的事情之一。

我提出的一个解决方案是,对数据库的所有更改都会留下日志,包括时间戳,uniqueid和其他几项内容,以确保事务完全匿名且完全唯一。 我做了一个非常简单的Web服务,它有两个操作,你可以添加事务,所以每当用户在wifi上时我都会同步,所以我推送所有更改,从服务器接收结果,然后删除交易记录,因为它们同步。

另一个操作是获取记录,发送上次同步的时间戳,用户ID和其他。

所有数据都使用JSON发送并按原样接收。 它可以轻松处理在小型Amazon EC2服务器上运行的数万用户。

这几乎是iCloud的工作方式,但我在iCloud之前制作了这个解决方案。 现在我要去iCloud,但可能需要让服务器再运行1年左右,具体取决于使用情况。

希望这对你有所帮助。

在找到时间回到应用程序以及时间传递和Core Data iCloud复制成熟之后,我将我的应用程序转换为Core Data(NSSQLiteStoreType)并监视诸如persistentStoreDidImportUbiquitousContentChanges之类的通知。 也使用轻量级迁移。 运作良好。