将本地Core Data移至iCloud

时间:2014-08-13 20:46:38

标签: ios objective-c cocoa-touch core-data icloud

如何在已使用本地存储核心数据的应用中启用iCloud核心数据?

我试图在我的持久商店选项中使用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,而无需手动转移每个实体。

有什么想法吗?我可以找到很多关于从 iCloud移回本地存储的文章,教程和帖子 - 但我想将 本地存储移到< / em> iCloud

2 个答案:

答案 0 :(得分:21)

以下是您需要做的事情

  1. 创建本地NSPersistentStoreCoordinator
  2. 将现有的持久存储添加到该协调器,并存储对此新返回的存储的引用。
  3. 调用方便的migratePersistStore:...提供#2的商店,文件目录中商店的URL,文件名不同,所有重要选项包括NSPersistentStoreUbiquitousContentNameKey键。
  4. 这是代码,在线注释。

    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一起使用的持久性存储,并始终使用NSPersistentStoreUbiquitousContentNameKey键包含上面的iCloudOptions。

    这是基于Apple's documentation

    完成后,您应该在模拟器文件夹(〜/ Library / Application Support / iPhone Simulator / ...)中的Documents文件夹中看到一个名为CoreDataUbiquitySupport的新文件夹。嵌套在你的iCloud同步sqlite商店深处。

    多田!


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

答案 1 :(得分:2)

看看这个示例应用程序,其中包含将本地核心数据存储迁移到iCloud并再次返回的代码。最好阅读相关文档并在您的环境中构建示例应用程序以使它们正常工作,一旦它们正在工作,然后尝试重构您的代码以使用类似的方法。

随时给我发送电子邮件以获取进一步的帮助。抱歉没有在这里给你答案,但这可能是一个非常复杂的问题。

http://ossh.com.au/design-and-technology/software-development/sample-library-style-ios-core-data-app-with-icloud-integration/