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 核心数据未同步第二台设备上的所有记录的主要内容,如果未能解决你的问题,请参考以下文章

向用户显示 iCloud 同步正在进行中

核心数据 - 通过 iCloud 保存和共享图像

iOS 核心数据存储在 iCloud 中以与其他设备同步

无法在设备之间进行 iCloud 同步

未启用 iCloud 时如何存储核心数据日志?

iCloud - 核心数据同步问题