0

当我在 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 条记录。

有人对这里可能发生的事情有任何建议吗?

谢谢雷

4

1 回答 1

0

如果您查看 sqlite 存储本身,您会看到 iOS 正在添加列和表以保留其引用。除非您计算并存储在@property 中,否则无法通过代码添加主键。但话又说回来,核心数据并不关心它。预先计算的 ID 仅在您的应用程序逻辑中为您服务。

对于 iCloud 部分,您是对的:iCloud 通过事务日志传输数据。事务日志被复制到每个设备,并从那里填充 sqlite 存储。

文档说事务日志会保留一段合理的时间,然后被丢弃。这可能是只有 4000 条记录而不是 6000 条的原因。

此外,这不是您的情况,但除此之外,根据我的经验,最好从一开始就引入 iCloud,当时所有设备都是空的。如果您在设备部分填充了自己的数据时引入 iCloud,您可能会遇到奇怪的问题。

如果您还没有这样做,我还建议在 Xcode 方案中打开 iCloud 调试。

我个人认为,同步更多的数据库是一项相当困难的工作,我仍然想知道如何仅通过处理事务日志共享来正确完成。事实上,至少在 iOS 5 Core Data 和 iCloud 中是完全不可靠且危险的。

于 2013-09-05T07:42:46.857 回答