当我在iCloud中创建一个sqlite核心数据存储并在一台设备上播种时,它工作正常并且有大约6,000条记录。当我在第二台设备上创建商店时,它会同步,但最终只有大约4,000条记录(大概来自事务日志)。我的同步代码响应NSPersistentStoreDidImportUbiquitousContentChangesNotification读取......
NSUndoManager * undoManager = [context undoManager];
[undoManager disableUndoRegistration];
[context mergeChangesFromContextDidSaveNotification:info];
[context processPendingChanges];
[undoManager enableUndoRegistration];
但是,当我插入调试语句时......
NSSet *updatedObjects = [[info userInfo] objectForKey:NSUpdatedObjectsKey];
NSSet *deletedObjects = [[info userInfo] objectForKey:NSDeletedObjectsKey];
NSSet *insertedObjects = [[info userInfo] objectForKey:NSInsertedObjectsKey];
NSLog(@"found transaction log. updated %d, deleted %d, inserted %d", updatedObjects.count, deletedObjects.count, insertedObjects.count);
我得到一个意想不到的'0'一切,但我知道它正在同步,因为数据库中有大约4,000条记录。
有没有人对这里可能发生的事情有什么建议?
由于 射线
答案 0 :(得分:0)
如果您查看sqlite商店本身,您会看到iOS正在添加列和表以保持其引用。除非您计算并存储在@property中,否则无法通过代码添加主键。但话说回来,核心数据并不关心它。预先计算的ID仅在您的应用程序逻辑中为您提供服务。
对于iCloud部分,您说得对:iCloud通过事务日志传输数据。事务日志将复制到每个设备,并从那里填充sqlite store。
文档说事务日志保留了合理的时间,然后被删除。这可能是仅有4000条记录而不是6000条记录的原因。
此外,它不是你的情况,但除此之外,根据我的经验,最好从一开始就介绍iCloud,当时所有设备都是空的。如果你在设备部分填充自己的数据时引入iCloud,你可能会遇到奇怪的问题。
如果你还没有这样做,我还建议在Xcode方案中打开iCloud调试。
我个人认为,要同步更多的数据库,这是一项相当困难的任务,我仍然想知道如何通过仅处理事务日志共享来正确完成它。事实上,至少在iOS 5核心数据和iCloud完全不可靠和危险的情况下。