核心数据和iCloud添加预先填充的sqlite文件

我正在使用Core Data和iCloud在多个iPad之间同步数据的应用程序。 这一切都工作正常,我可以添加数据到每个iPad,它会同步它们之间的所有。

我有一个核心数据sqlite文件,预填充的国家列表,我想复制到应用程序的第一次运行文档区域。 我有这个工作,但已经改变了我的persistentStoreCoordinator实施,以testing是否支持iCloud和其他一些小的变化。

但是,现在当我检查,看是否存在sqlite文件,并复制预填充SQLite文件,如果没有我在下面的错误

[psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:iCloudData] options:options error:&persistentStoreError]; 

NSPersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:error :: CoreData:Ubiquity:设置无处不在集成时发生错误:Error Domain = NSCocoaErrorDomain Code = 134316“无处不在的容器似乎不匹配这个持久存储,这是可能的是由于切换到不同的iCloud帐户,或者完全从iCloud注销引起的,应该使用只读属性重新打开存储或从iCloud永久同步删除存储。 UserInfo = 0x1cb590 {storeUUID = 31381598-EAFA-4550-9B96-F501800974D5,containerUUID = E3A8DC7D-41FD-405A-8D8A-C06C8B467CA2,NSLocalizedDescription =无处不在的容器似乎不匹配这个永久性存储,这可能是由切换到另一个iCloud帐户,或完全注销iCloud。 商店应该以只读属性重新打开,或者从iCloud永久同步中删除。}

这是因为在iCloud中还有不同的Core Data sqlite文件或事务日志文件? 如果是这样,我将如何删除它们?

您不应该将预先创build的Core Data存储复制到无处不在的容器中。 旧的方法是在模拟器/设备/计算机上创build一个SQLite文件,并将其复制到第一次运行的位置。 如果您使用iCloud,则无法再进行此操作。 iCloud可以通过每台设备接收一系列更改为“事务日志”,然后将其应用于自己的SQLite存储。 它需要知道发生了什么变化,并获得一个.sqlite文件一个一个不会告诉它。

iCloud的做法是:

  • 从代码中创build初始数据(例如insertStartData:方法)。 你可以从plist中添加它,或者你喜欢的任何东西。 您必须先检查数据是否已经在那里。
  • 使用NSPersistentStoreCoordinatormigratePersistentStore:toURL:options:withType:error来复制初始存储。

这里是文档:

您不应该使用预先打包的数据库文件对初始内容进行种子处理。 相反,您应该在代码中创build默认项目,或使用NSPersistentStoreCoordinator的migratePersistentStore:toURL:options:withType:error:方法将预打包数据库迁移到所需位置。