我有一个iPhone(iOS)应用程序,可以将数据保存在每台设备上的本地SQLite数据库中。该应用程序用于管理孩子的虚拟银行帐户,以跟踪他们的津贴,支出,储蓄等(KidsBank和KidsBank Free)。我收到了很多父母的请求,要求父母之间甚至可能是他们孩子的iOS设备之间提供同步功能。
我考虑了几个选项,但是所有这些选项都很乏味且非常重要,因为这基本上需要数据库复制或新架构。理想情况下,任何设备上的任何事务都应该出现(同步)到系列中的所有设备(尽可能立即)。
理想情况下,我希望同步是自动的&放手
选项包括 (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)移动整个数据库或管理服务器上的事务。 PRO:不再需要同步 CON:网络驱动应用的典型问题。需要重写数据库服务层(目前在SQL中)才能使用远程Web服务。运行服务器的成本(我会使用AWS)。
有人可以提供一些在多个设备之间同步SQLite的经验吗?我倾向于使用iCloud来推动事务日志。我正在努力降低成本和复杂性。
答案 0 :(得分:3)
迁移到iCloud可能是最好的解决方案,因为Apple已经证明并制作了它。你不需要担心iOS 5的要求,因为根据大多数统计数据,超过90%使用它。 iOS 5可以免费升级到。然后,您可以将旧版本重命名为Lite,并在不同步的情况下继续。
同步可能是你做过的最艰难的事情之一。
我提出的一个解决方案是对数据库的所有更改都会留下一个日志,包括时间戳,uniqueid和其他几项内容,以确保事务完全是匿名且完全唯一。我已经制作了一个非常简单的Web服务,它有两个操作,你可以添加事务,所以每当用户在wifi上时我就会同步,所以我推送所有更改,从服务器接收结果,然后删除交易记录,因为它们同步。
另一个操作是获取记录,发送上次同步的时间戳,用户ID等。
所有数据都是使用JSON发送的,并且是这样接收的。它可以轻松处理在小型Amazon EC2服务器上运行的数万用户。
这几乎是iCloud的工作方式,但我在iCloud之前制作了这个解决方案。现在我要去iCloud,但可能需要让服务器再运行1年左右,具体取决于使用情况。
希望这会对你有所帮助。
答案 1 :(得分:2)
在找到时间回到应用程序并且随着时间的推移和Core Data iCloud复制日趋成熟之后,我将我的应用程序转换为Core Data(NSSQLiteStoreType)并监视诸如persistentStoreDidImportUbiquitousContentChanges之类的通知。也使用轻量级迁移。运作良好。