Core Data和iCloud添加预先填充的sqlite文件

时间:2012-04-13 11:59:42

标签: iphone ios ipad core-data icloud

我正在开发一款使用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:设置ubiquity集成时出错:Error Domain = NSCocoaErrorDomain Code = 134316“ubiquity容器似乎与此持久性存储不匹配,它这可能是由于切换到不同的iCloud帐户或完全退出iCloud造成的。应该使用只读属性重新打开商店,或者从iCloud永久同步中删除商店。“ UserInfo = 0x1cb590 {storeUUID = 31381598-EAFA-4550-9B96-F501800974D5,containerUUID = E3A8DC7D-41FD-405A-8D8A-C06C8B467CA2,NSLocalizedDescription = ubiquity容器似乎与此持久存储不匹配,这可能是由切换引起的到不同的iCloud帐户,或完全退出iCloud。商店应该使用只读属性重新打开,或者从iCloud永久同步中删除。}

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

1 个答案:

答案 0 :(得分:4)

您不应该将预先创建的Core Data商店复制到普遍存储容器中。执行此操作的旧方法是在模拟器/设备/计算机上创建SQLite文件,并在首次运行时将其复制到其位置。如果您使用iCloud,则无法再执行此操作。 iCloud通过每个接收更改列表的设备作为“事务日志”工作,然后将其应用于它自己的SQLite存储。它需要知道改变了什么,并且一次性获取.sqlite文件不会告诉它。

iCloud的方法是:

  • 从代码中创建初始数据(例如insertStartData:方法)。您可以从plist或任何您喜欢的地方添加它。您必须先检查数据是否已经存在。
  • 使用NSPersistentStoreCoordinator的{​​{1}}复制您的初始商店。

Here's the docs:

  

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