我有一个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)移动整个数据库或管理服务器上的事务.专业版:不再需要同步CON:网络驱动应用的典型问题.需要重写数据库服务层(目前在SQL中)才能使用远程Web服务.运行服务器的成本(我会使用AWS).
任何人都可以提供一些在多个设备之间同步SQLite的经验吗?我倾向于使用iCloud来推动事务日志.我正在努力降低成本和复杂性.
iPhone/iOS应用程序使用CoreData + SQLite(NSSQLiteStoreType)+ iCloud iOS.当应用程序在首次安装时启动时(或通过xcode删除并重新安装后),并且先前安装或同一帐户中的其他设备在iCloud中存在先前的应用程序数据时,会发生以下错误,然后是60秒的重试延迟,然后成功迁移到iCloud.结果是应用程序的用户认为在升级应用程序时他们的数据会丢失.但是,在60秒延迟之后,数据将恢复.错误和一些代码如下.
是什么导致这个错误?在哪里可以了解有关此错误的更多信息?
[4972:2014294] CoreData:iCloud:错误:初始同步通知返回错误(错误域= BRCloudDocsErrorDomain Code = 12"操作无法完成.(BRCloudDocsErrorDomain错误12))"
[4972:2014294] -PFUbiquitySetupAssistant finishSetupWithRetry :: CoreData:Ubiquity ::延迟后重试:60 Error Domain = BRCloudDocsErrorDomain Code = 12"操作无法完成.(BRCloudDocsErrorDomain error 12.)"
这是一个代码片段和更详细的日志,以提供更多上下文.
来自app委托:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
... standard iCloud and app setup ...
NSManagedObjectContext *context = [self managedObjectContext];
...
... query the db ...
}
/**
Returns the managed object context for the application.
If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application. …Run Code Online (Sandbox Code Playgroud)