mon*_*uno 4 core-data ios icloud
我的应用程序正在使用核心数据SQLite数据库.我想让我的用户使用iCloud在设备之间进行同步 - 我以为我可以使用UIManagedDocument.
我按照Apple的文档对其进行了子类化,并且在需要创建新的持久性存储文件时它可以正常工作.但是,当我尝试使用它打开我的旧持久存储文件时,我得到以下异常抛出错误:
"UIManagedDocument只能读取文件包的文档"
这是否意味着我需要将旧的持久性存储迁移到由UIManagedDocument管理的新商店?如果是这样,我是否需要手动执行此操作(即从旧商店一次一个地读取每条记录并将其写入新的记录中)?
提前致谢!
UIManagedDocument创建包(文件夹)而不是原子库.商店仍在那里,但它埋在包里.如果右键单击模拟器中Documents文件夹中创建的文件,您将能够看到结构.默认是
mydocument.foo
-> StoreContent
-> persistentStore
Run Code Online (Sandbox Code Playgroud)
您需要做的是为您的应用程序文件类型创建一个新的扩展,例如,如果您的数据库扩展是 .myappdb需要在项目设置中创建一个新的文档类型,可能是这样.myappdbw.您可以复制条目中的所有设置.myappdb
接下来,在您处理打开旧文档的位置mydocumenturl而不是将其传递给持久性存储协调器时,您将创建上面的目录结构.
NSURL *newurl = [[mydocumenturl URLByDeletingPathExtension] URLByAppendingPathExtension:@"myappdbw"];
NSURL *desturl = [newurl URLByAppendingPathComponent:@"StoreContent"];
[[NSFileManager defaultManager] createDirectoryAtURL:desturl withIntermediateDirectories:YES attributes:nil error:NULL];
NSURL *finalurl = [desturl URLByAppendingPathComponent:@"persistentStore"];
Run Code Online (Sandbox Code Playgroud)
然后将旧数据库移动到您创建的文件夹系统中
[[NSFileManager defaultManager] moveItemAtURL:mydocumenturl toURL:finalurl error:NULL];
Run Code Online (Sandbox Code Playgroud)
然后你可以将bundle url传递给UIManagedDocument
UIManagedDocument *doc = [[UIManagedDocument alloc] initWithFileURL:newurl];
Run Code Online (Sandbox Code Playgroud)
一个对iCloud集成有用的链接是
http://developer.apple.com/library/ios/#releasenotes/DataManagement/RN-iCloudCoreData/_index.html
它有点神秘,因为大多数承诺的示例代码到目前为止都没有出现,但另一方面它的演绎主要相当简单.有关更多提示,请查看WWDC2011会话107,116和315.
但请注意,如果您要使用此方法迁移旧文档,则DONT会设置NSPersistentStoreUbiquitousContentNameKey您迁移的时间点,因为包时会更改.上面的文档很好地描述了它.
| 归档时间: |
|
| 查看次数: |
3686 次 |
| 最近记录: |