如何将现有核心数据iOS 7应用程序的数据迁移到iCloud?

时间:2014-02-28 19:42:05

标签: ios core-data ios7 icloud

我有一个已经使用Core Data的iOS 7应用程序。我使用了新的iOS 7方法将iCloud集成到我的应用程序中,以下面的代码为例同步存储在核心数据中的项目:

https://github.com/mluisbrown/iCloudCoreDataStack/blob/master/README.md

这很有效,除了设备上的所有原始数据都没有显示在iCloud存储中。我一直听说我需要迁移数据 - 但我找不到任何关于如何正确执行此操作的示例。有谁知道怎么做?

我一直指向使用migratePersistentStore:toURL:options:withType:error:,但我不知道如何使用它...

2 个答案:

答案 0 :(得分:3)

这是一个带有iCloud控制面板的示例应用程序,用于将商店移入或移出iCloud。要移动现有商店,您需要使用现有选项打开它,但请确保为目标商店使用iOS7选项。请查看OSCDStackManager中的示例应用代码,如果您有具体问题,请发布。 http://ossh.com.au/design-and-technology/software-development/sample-library-style-ios-core-data-app-with-icloud-integration/

- (bool)moveStoreFileToICloud:(NSURL*)fileURL delete:(bool)shouldDelete backup:(bool)shouldBackup {
    FLOG(@" called");

    // Always make a backup of the local store before migrating to iCloud
    if (shouldBackup)
        [self backupLocalStore];

    NSPersistentStoreCoordinator *migrationPSC = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];

    // Open the existing local store using the original options
    id sourceStore = [migrationPSC addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:fileURL options:[self localStoreOptions] error:nil];

    if (!sourceStore) {

        FLOG(@" failed to add old store");
        return FALSE;
    } else {
        FLOG(@" Successfully added store to migrate");

        bool moveSuccess = NO;
        NSError *error;

        FLOG(@" About to migrate the store...");
        // Now migrate the store using the iCloud options
        id migrationSuccess = [migrationPSC migratePersistentStore:sourceStore toURL:[self icloudStoreURL] options:[self icloudStoreOptions] withType:NSSQLiteStoreType error:&error];

        if (migrationSuccess) {
            moveSuccess = YES;
            FLOG(@"store successfully migrated");
            [self deregisterForStoreChanges];
            _persistentStoreCoordinator = nil;
            _managedObjectContext = nil;
            self.storeURL = [self icloudStoreURL];
            // Now delete the local file
            if (shouldDelete) {
                FLOG(@" deleting local store");
                [self deleteLocalStore];
            } else {
                FLOG(@" not deleting local store");
            }
            return TRUE;
        }
        else {
            FLOG(@"Failed to migrate store: %@, %@", error, error.userInfo);
            return FALSE;
        }

    }
    return FALSE;
}

答案 1 :(得分:1)

您将现有商店移至其他路径,然后调用migrate方法,并将toURL设置为您希望商店结束的路径。

您需要传递包含iCloud商店需要设置的普遍性设置的选项。

迁移完成后,您应该拥有两个商店副本:您移动到一边的非iCloud副本,以及设置了iCloud选项的新副本。您现在可以删除旧商店,只需设置您的Core Data堆栈即可使用iCloud商店。

看一下这个example中的一些方法。特别是,看看以'migrate'开头的那些。您应该能够确定将数据迁移到新云存储的步骤。

核心数据同步很难做到,特别是当您开始迁移数据时。值得查看其他核心数据同步选项,例如Wasabi SyncEnsembles。它们自动处理数据的迁移和合并。 (披露:我开发合奏)