iCloud 核心数据未同步第二台设备上的所有记录
Posted
技术标签:
【中文标题】iCloud 核心数据未同步第二台设备上的所有记录【英文标题】:iCloud Core Data Not Synching All Records On Second Device 【发布时间】:2013-09-05 00:27:11 【问题描述】:当我在 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 条记录。
有人对这里可能发生的事情有任何建议吗?
谢谢 雷
【问题讨论】:
似乎在创建第二个数据库时,它使用事务日志来填充它,因为如果我删除事务日志,则数据库为空。但是,它似乎并没有填充所有记录。为了解决冲突,它甚至如何知道主键是什么?我不记得在数据模型中声明了主键。 【参考方案1】:如果您查看 sqlite 存储本身,您会发现 ios 正在添加列和表以保留其引用。除非您计算并存储在@property 中,否则无法通过代码添加主键。但话又说回来,核心数据并不关心它。预先计算的 ID 仅在您的应用程序逻辑中为您服务。
对于 iCloud 部分,您是对的:iCloud 通过事务日志传输数据。事务日志被复制到每个设备,并且从那里填充 sqlite 存储。
文档说事务日志会保留一段合理的时间,然后将其丢弃。这可能是只有 4000 条记录而不是 6000 条的原因。
另外,这不是你的情况,但除此之外,根据我的经验,最好从一开始就引入 iCloud,那时所有设备都是空的。如果您在设备部分填充了自己的数据时引入 iCloud,您可能会遇到奇怪的问题。
如果你还没有这样做,我也建议在 Xcode 方案中打开 iCloud 调试。
我个人的看法,同步更多的数据库是一个相当困难的任务,我仍然想知道仅处理事务日志共享如何才能正确完成。事实上,至少在 iOS 5 Core Data 和 iCloud 中是完全不可靠且危险的。
【讨论】:
以上是关于iCloud 核心数据未同步第二台设备上的所有记录的主要内容,如果未能解决你的问题,请参考以下文章