将本地核心数据移动到 iCloud

2024-01-08

如何在已使用本地存储 Core Data 的应用程序中启用 iCloud Core Data?

我尝试过使用NSPersistentStoreUbiquitousContentNameKey在我的持久存储选项中。不幸的是,此选项启用 iCloud,但不会将任何本地数据传输到 iCloud。我似乎无法得到migratePersistentStore:toURL:options:withType:error:要么工作。我提供了持久存储、其 URL、iCloud 选项等,但它仍然不会将现有的本地数据迁移到 iCloud。这是我使用该方法的方式:

- (void)migratePersistentStoreWithOptions:(NSDictionary *)options {
    NSError *error;
    self.storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.sqlite", self.SQLiteFileName]];

    NSPersistentStore *store = [self.persistentStoreCoordinator migratePersistentStore:self.persistentStoreCoordinator.persistentStores.firstObject toURL:self.storeURL options:options withType:NSSQLiteStoreType error:&error];
    if (store) NSLog(@"[CoreData Manager] Store was successfully migrated");
    else NSLog(@"[CoreData Manager] Error migrating persistent store: %@", error);
} 

本地存储与 iCloud 存储保持分离。如果可能的话,我想将本地核心数据移动到 iCloud,而无需手动传输每个实体。

有任何想法吗?我可以找到很多有关移回本地存储的文章、教程和帖子fromiCloud - 但我想移动from本地存储to iCloud.


这是你需要做的

  1. 创建本地 NSPersistentStoreCoordinator
  2. 将现有的持久存储添加到该协调器并存储对此新返回的存储的引用。
  3. 调用这个方便的 migratePersistStore:... 提供 #2 中的存储、文档目录中具有不同文件名的存储的 URL 以及包括 NSPersistentStoreUbiquitousContentNameKey 键在内的所有重要选项。

这是代码,内嵌注释。

NSURL *documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];

//This is the path to the new store. Note it has a different file name
NSURL *storeURL = [documentsDirectory URLByAppendingPathComponent:@"TestRemote.sqlite"];

//This is the path to the existing store
NSURL *seedStoreURL = [documentsDirectory URLByAppendingPathComponent:@"Test.sqlite"];

//You should create a new store here instead of using the one you presumably already have access to
NSPersistentStoreCoordinator *coord = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];

NSError *seedStoreError;
NSDictionary *seedStoreOptions = @{ NSReadOnlyPersistentStoreOption: @YES };
NSPersistentStore *seedStore = [coord addPersistentStoreWithType:NSSQLiteStoreType
                                                   configuration:nil
                                                             URL:seedStoreURL
                                                         options:seedStoreOptions
                                                           error:&seedStoreError];

NSDictionary *iCloudOptions = @{ NSPersistentStoreUbiquitousContentNameKey: @"MyiCloudStore" };
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

//This is using an operation queue because this happens synchronously
[queue addOperationWithBlock:^{
    NSError *blockError;
    [coord migratePersistentStore:seedStore
                            toURL:storeURL
                          options:iCloudOptions
                         withType:NSSQLiteStoreType
                            error:&blockError];

    NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
    [mainQueue addOperationWithBlock:^{
        // This will be called when the migration is done
    }];
}];

请注意,执行此迁移后,您需要使用新 URL 配置与 MOC 一起使用的持久存储,并始终包含上面的 iCloudOptions 和 NSPersistentStoreUbiquitousContentNameKey 键。

这是基于苹果的文档 https://developer.apple.com/library/ios/documentation/DataManagement/Conceptual/UsingCoreDataWithiCloudPG/UsingSQLiteStoragewithiCloud/UsingSQLiteStoragewithiCloud.html#//apple_ref/doc/uid/TP40013491-CH3-SW3.

完成后,您应该会在模拟器文件夹 (~/Library/Application Support/iPhone Simulator/...) 的 Documents 文件夹中看到一个标有 CoreDataUbiquitySupport 的新文件夹。嵌套在里面的是你的 iCloud 同步 sqlite 存储。

Tada!


编辑:哦,请确保您已创建 iCloud 权利并将其包含在您的捆绑包中。您应该能够在 Xcode 中完成所有这些操作,但您也可以在开发门户上更新它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将本地核心数据移动到 iCloud 的相关文章

随机推荐

  • 是否可以更新/覆盖 Airflow [‘dag_run’].conf?

    我们通常使用以下方式启动 Airflow DAG trigger dagCLI 命令 例如 airflow trigger dag my dag conf field1 1 field2 2 我们在操作员中使用以下命令访问此配置contex
  • 如何将参数传递给 jQuery UI 对话框事件处理程序?

    我目前正在尝试连接 jQuery UI 对话框 以便我可以使用它在我的页面上创建新项目并修改页面上已有的项目 我在前者中做到了 然而 我目前正在为后一个问题而苦苦挣扎 我只是找不到一种好的方法来将要修改的项目传递到对话框 这里有一些代码可以
  • 找不到资源包异常

    我想使用一个名为的资源包strings但在运行我的主要方法时出现以下错误MainApplication java java util MissingResourceException Can t find bundle for base n
  • 如何在 Python 中查找第二天同一小时的 Unix 时间戳(包括 DST)?

    在Python中 我可以找到本地时间的Unix时间戳 了解时区 如下所示 使用pytz gt gt gt import datetime as DT gt gt gt import pytz gt gt gt mtl pytz timezo
  • 无法使用 Samsung AVPlay API 更改播放头位置

    我有一个 typescript javascript Tizen Web 应用程序运行在三星智能电视模拟器 v5 0 https developer samsung com tv develop api references samsung
  • TypeScript 中抽象类的抽象构造函数

    如何为抽象类创建抽象构造函数 例如 如果我有这个抽象类 export abstract class Foo
  • 比较图像相似度的简单快速方法

    我需要一种简单快速的方法来比较两个图像的相似性 IE 如果它们包含完全相同的内容 但可能有一些稍微不同的背景 并且可能会移动 调整几个像素 我想获得一个高值 更具体地说 如果这很重要 一张图片是一个图标 另一张图片是屏幕截图的一个子区域 我
  • 在javamail中设置“mail.strictly_mime.parm_folding”

    我确实使用 javamail 发送带有长文件名附件的邮件 javamail 根据最新的 RFC 进行操作 并将文件名跨越邮件标头的两行 如下例所示 Part 0 978693914 1433356404377 Content Disposi
  • 为什么我的数组中的某些值未定义

    我在 php 中有一个 for 循环 它在我的页面上添加了许多复选框 如下所示
  • 如何从 v-text 字段或 v-input 字段中删除下划线

    我尝试从 Vuetify 中的 v input v text 或 v autocomplete 字段中删除下划线 但我找不到如何 有没有办法从 Vuetify 中的 v input v text 或 v autocomplete 字段中删除
  • jQuery UI 自动完成在输入字段中显示值而不是标签

    jQuery UI 自动完成的一个潜在的简单问题困扰着我 我的来源是 var ac label One Thing value One Thing label Two Thing value Two Thing 我正在调用小部件 funct
  • 如何创建通用数组? [复制]

    这个问题在这里已经有答案了 我不明白泛型和数组之间的联系 我可以使用泛型类型创建数组引用 private E elements GOOD 但无法创建具有泛型类型的数组对象 elements new E 10 ERROR 但它有效 eleme
  • 如何使用 getattr 从模型中获取外键值

    我有一个模型Project我通过以下指令获得了它的属性 attr getattr project id None project是实例 id是场并且None是默认的返回类型 我的问题是 如果我想用这个来获取外键怎么办 获取客户姓名 proj
  • NPM:运行 npm 时找不到 npm-cli.js

    通常我可以使用安装库npm但是今天安装 yeoman 时遇到了这个错误 请帮忙找出根本原因 D Works phonegap ionic todo gt npm install g yo module js 340 throw err Er
  • SELECT 上触发触发器

    我是触发器新手 在从 sql server 中的数据库表中选择值时需要触发触发器 我尝试过在插入 更新和删除时触发触发器 选择值时有什么方法可以触发触发器吗 我知道只有两种方法可以做到这一点 而且都不是触发器 您可以使用存储过程来运行查询并
  • Angular 4 - 在下拉列表中选择默认值 [Reactive Forms]

    在 Angular 4 中 我在 json 配置文件中定义了以下配置 countries USA UK Canada default UK 我需要使用反应性模块在下拉列表中显示这些 这是执行此操作的代码 ts countries strin
  • 温斯顿:了解日志记录级别

    阅读和摆弄温斯顿 我很困惑为什么日志记录级别按原样排序 以及为什么传输以它们的方式运行 好吧 至少是控制台 如果有人能够 甚至可能彻底 用真实的用例示例解释为什么使用 Winston 进行日志记录会以这种方式工作 我将不胜感激 例如 我像这
  • std::sort 算法内存使用

    我想知道标准库排序算法 例如 std sort 是否使用堆内存进行排序 是否有任何可靠的来源如何找出排序算法或任何标准库算法一般使用哪种类型 堆 堆栈 和多少临时内存 背景是我考虑将一些标准库算法引入嵌入式环境 其中受控的内存使用至关重要
  • 为什么单击对附加元素不起作用?

    我想使用 jQuery 将一些 html 元素从一个容器无休止地移动到另一个容器append函数 但是当我单击已附加的元素时 单击事件将不再触发 基于与我类似的一些线程 我发现附加元素已从其事件侦听器中剥离 我怎样才能避免这种情况 有人可以
  • 将本地核心数据移动到 iCloud

    如何在已使用本地存储 Core Data 的应用程序中启用 iCloud Core Data 我尝试过使用NSPersistentStoreUbiquitousContentNameKey在我的持久存储选项中 不幸的是 此选项启用 iClo