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

Ios 核心数据:处理iCloud关闭/打开时的情况,ios,objective-c,cocoa-touch,core-data,icloud,Ios,Objective C,Cocoa Touch,Core Data,Icloud,我正在我的核心数据应用程序中实施iCloud支持(仅限iOS 7,尚未发布,iCloud支持将从第一天开始)。我已经查看了WWDC 2013 207关于iCloud变化的课程,我真的很高兴看到这些改进(我以前也有过iCloud的一些经验) 一切都很顺利。但是,我不知道如何处理用户从系统首选项启用或禁用iCloud时的情况-这会导致在另一个目录中创建新的.sqlite文件,从而导致用户数据丢失 以下是我如何实现持久存储添加: - (void) addPersistentStoreToCoordin

我正在我的核心数据应用程序中实施iCloud支持(仅限iOS 7,尚未发布,iCloud支持将从第一天开始)。我已经查看了WWDC 2013 207关于iCloud变化的课程,我真的很高兴看到这些改进(我以前也有过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首选项时,如何保存核心数据中的数据

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


谢谢

我有同样的问题,发现了这个。现在,这段代码非常适合我。

这段代码非常棒,它有助于使用已启用的iCloud设置核心数据堆栈,但它并不能解决我所描述的问题。尝试在你的应用程序中创建一些数据,然后在设置(iCloud->Documents&data->your app)中关闭iCloud,我很确定你创建的数据将消失。我发现,在这两种情况下,此解决方案实际上都会在设备上保留数据。在iOS 7中,如果iCloud未启用、无法访问或设备上甚至没有设置iCloud,您可以透明地管理本地存储。我也不认为这会这么容易,但它对我来说很有效。如果你仍然坚持这样做,请查看此链接,以在用户更改iCloud设置时迁移核心数据文件。