核心数据:处理iCloud关闭/打开时的情况

时间:2013-11-11 14:29:46

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

我正在我的核心数据应用程序中实现iCloud支持(仅限iOS 7,尚未发布,iCloud支持将从第一天开始)。我已经查看了有关iCloud变化的WWDC 2013 207会话,我很高兴看到这些改进(我之前也有过iCloud的经验)。

事情真的很棒。但是,当用户从系统首选项启用或禁用iCloud时,我不确定如何处理这种情况 - 这会导致在另一个目录中创建新的.sqlite文件,从而导致用户数据丢失。

以下是我如何实施持久存储添加:

- (void) addPersistentStoreToCoordinator {

    NSMutableDictionary *options = [NSMutableDictionary dictionary];
    [options setObject:@YES forKey:NSMigratePersistentStoresAutomaticallyOption];
    [options setObject:@YES forKey:NSInferMappingModelAutomaticallyOption];

    NSURL *iCloud = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier: nil];

    if (iCloud) {
         [options setObject:@"ABC123~com~myapp~myapp" forKey:NSPersistentStoreUbiquitousContentNameKey];
    }

    NSError* error;

// the only difference in this call that makes the store an iCloud enabled store
// is the NSPersistentStoreUbiquitousContentNameKey in options.

    [persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType
                                          configuration:nil
                                                    URL:self.storeURL
                                                options:options
                                                  error:&error];
}

- (NSURL *)storeURL {

    NSURL *documentsDirectory = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory
                                                                       inDomain:NSUserDomainMask
                                                              appropriateForURL:nil
                                                                         create:YES
                                                                          error:NULL];

    return [documentsDirectory URLByAppendingPathComponent:@"MyApp.sqlite"];
}

当用户在设置中关闭/打开iCloud首选项时,如何从Core Data保存数据?

(附注:当iCloud从状态[OFF]> [ON]开始时,我已设法手动处理此案例 - 从旧Core Data获取所有数据,然后将这些NSManagedObject子类保存到新创建的核心数据已启用iCloud。但是,此代码非常适合应用程序(并且非常不稳定)。我正在寻找更通用的解决方案。)

由于

1 个答案:

答案 0 :(得分:1)

我有完全相同的问题并找到了https://gist.github.com/mluisbrown/7015953。现在对我来说很完美。