【问题标题】:Core Data: handle the case when iCloud turns off / onCore Data:处理iCloud关闭/开启的情况
【发布时间】:2013-11-23 09:35:03
【问题描述】:

我正在我的 Core Data 应用程序中实现 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] 变为状态时,我已经设法手动处理这种情况——从旧核心数据中获取所有数据,然后将这些 NSManagedObject 子类保存到启用 iCloud 的新创建的核心数据中. 但是,此代码是非常特定于应用程序的(并且非常不稳定)。我正在寻找更通用的解决方案)。

谢谢

【问题讨论】:

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


【解决方案1】:

我有完全相同的问题并找到了这个https://gist.github.com/mluisbrown/7015953。现在非常适合我。

【讨论】:

  • 这段代码 sn-p 很棒,它有助于设置一个启用了 iCloud 的核心数据堆栈,但它不能解决我所描述的问题。尝试在您的应用程序中创建一些数据,然后在设置中关闭 iCloud(iCloud -> 文档和数据 -> 您的应用程序),我很确定您创建的数据会消失。
  • 我发现这个解决方案实际上在两种情况下都将数据持久化在设备上。在 iOS 7 中,如果 iCloud 未启用、无法访问或设备​​上未设置 iCloud,则可以透明地管理本地存储。我也不认为这会这么容易,但它对我有用。
猜你喜欢
  • 1970-01-01
  • 2015-04-09
  • 2014-06-02
  • 2012-02-01
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 2015-04-04
  • 2012-12-15
相关资源
最近更新 更多