1

我正在开发一个使用 Core Data 和 iCloud 在多个 iPad 之间同步数据的应用程序。这一切都很好,我可以将数据添加到每个 iPad,它会在它们之间同步。

我有一个预先填充了国家列表的 Core Data sqlite 文件,我想在应用程序首次运行时将其复制到文档区域。我已经完成了这项工作,但更改了我的 persistentStoreCoordinator 实现以测试是否支持 iCloud 以及其他一些小的更改。

但是现在,当我检查 sqlite 文件是否存在并复制预填充的 sqlite 文件时,如果不存在,我会收到以下错误

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

NSPersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:error:: CoreData: Ubiquity: An error occurred while setting up the ubiquity integration: Error Domain=NSCocoaErrorDomain Code=134316 "The ubiquity container does not seem to match this persistent store, it is possible this是由切换到不同的 iCloud 帐户或完全退出 iCloud 引起的。应使用只读属性重新打开商店或从 iCloud 同步中永久删除。UserInfo=0x1cb590 {storeUUID=31381598-EAFA-4550-9B96-F501800974D5, containerUUID=E3A8DC7D-41FD-405A-8D8A-C06C8B467CA2, NSLocalizedDescription=ubiquity 容器似乎与此持久存储不匹配,这可能是由切换引起的到不同的 iCloud 帐户,或完全退出 iCloud。

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

4

1 回答 1

4

您不应该将预先创建的 Core Data 存储复制到 ubiquity 容器。旧的方法是在模拟器/设备/计算机上创建一个 SQLite 文件,并在第一次运行时将其复制到它的位置。如果您使用 iCloud,就不能再这样做了。iCloud 的工作原理是每台设备接收一个作为“事务日志”的更改列表,然后将其应用于它自己的 SQLite 存储。它需要知道发生了什么变化,而一次性获取一个 .sqlite 文件不会告诉它这一点。

执行此操作的 iCloud 方法是:

  • 从代码内部创建初始数据(例如insertStartData:方法)。您可以从 plist 或您喜欢的任何内容中添加它。您必须首先检查数据是否已经存在。
  • 使用NSPersistentStoreCoordinator'smigratePersistentStore:toURL:options:withType:error复制您的初始商店。

这是文档:

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

于 2012-04-15T12:10:47.617 回答