iphone - 未启用 iCloud 时如何存储核心数据日志?

标签 iphone objective-c ios core-data icloud

我希望用户在禁用 iCloud 时能够继续正常使用核心数据存储。我遇到的唯一问题是他们可能有很多数据在启用时生成日志,然后如果他们再次启用它,我要么不添加他们从那时起制作的所有数据要么添加所有数据,从而复制现有数据。为避免此问题,我想在禁用 iCloud 时继续制作日志,以便它可以在再次启用时上传这些更改。

这是连接到 iCloud 时我必须执行的代码:

NSURL *iCloud = [fileManager URLForUbiquityContainerIdentifier:nil];

NSURL *iCloudLogsPath = [NSURL fileURLWithPath:[[iCloud path] stringByAppendingPathComponent:iCloudLogsDirectoryName]];

NSMutableDictionary *options = [NSMutableDictionary dictionary];
        [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
        [options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];
        [options setObject:iCloudEnabledAppID            forKey:NSPersistentStoreUbiquitousContentNameKey];
        [options setObject:iCloudLogsPath                forKey:NSPersistentStoreUbiquitousContentURLKey];

[psc addPersistentStoreWithType:NSSQLiteStoreType
                          configuration:nil
                                    URL:store
                                options:options
                                  error:nil];

最佳答案

不幸的是,这不是一个选项。当启用 iCloud 并且您使用 NSPersistentStoreUbiquitousContentNameKey 时,会自动创建 Core Data 事务日志。在所有其他情况下,不会创建任何事务日志。在没有启用 iCloud 的情况下,您的代码无法强制创建日志。这种情况只是尝试将 iCloud 与 Core Data 结合使用时出现的许多意外并发症之一。

一种可能的方法:当您发现 iCloud 已启用时,将您的整个数据存储迁移到 iCloud,不要担心是否已经有任何东西。然后,使用重复检测方法清除重复条目。 Apple 在他们的 SharedCoreData 示例项目中提供了一个很好的重复检测代码示例,该示例项目在 WWDC 2012 第 227 节将 iCloud 与 Core Data 结合使用中进行了介绍。

另一种方法是在禁用 iCloud 时维护您自己的更改日志。使用 NSManagedObjectContextDidSaveNotification 观察变化,并保留您自己的在 iCloud 被禁用时发生变化的对象列表。如果重新启用 iCloud,您可以重新保存这些对象以生成 iCloud 交易。

不过,对于其中任何一个,都需要考虑一些相关的并发症:

  1. 如果用户在您的应用运行时禁用了 iCloud,您将无法继续使用现有的持久性存储协调器,甚至无法继续使用现有的数据存储。如果这样做,您的应用程序将尝试写入事务日志,由于没有地方放置它们而失败,然后崩溃。您需要转移到新的非 iCloud 数据存储。您或许可以使用 migratePersistentStore:toURL:options:withType:error: 一步完成此操作,但您必须这样做。 (顺便说一句,它可能可能会弄乱数据存储的元数据,但这没有记录,我不知道要清除哪些 key )。

  2. 与上述相关,如果用户重新启用 iCloud,您将需要迁移回支持 iCloud 的数据存储。

  3. 如果您的应用程序启动时未启用 iCloud,那么在设置持久存储协调器时,您实际上应该只使用 nil 作为选项。检查 URLForUbiquityContainerIdentifier: 返回的值,并相应地继续使用或不使用 iCloud。

  4. 根据我的经验——iCloud 的核心数据不稳定。除其他事项外,确定检查 addPersistentStoreWithType:etc 的返回值,因为它可能会因为没有显而易见的原因而失败(即你做的一切都是正确的,但 iCloud 只是不正常).

祝你好运,你将需要它。请记住,截至今天,即使是 Apple 也没有在他们自己的任何应用程序中使用 iCloud 和 Core Data。

关于iphone - 未启用 iCloud 时如何存储核心数据日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13811340/

相关文章:

ios - 仅当从单元格外部点击屏幕时 UIMenuController 才会被关闭

ios - 适用于 Swift 的 Facebook SDK 4.1。用于共享和登录的单个按钮

objective-c - 如何设置 UISegmentedControl 的默认状态?

iphone - 在 iPhone 中长按拖动 UIButton

ios - 重新排列 iPhone 提醒中的按钮?

html - iOS-如何在横向中生成PDF

iphone - UIImage 到字节数组

ios - 如果在 Facebook 登录 iOS 应用程序的授权中拒绝其权限,如何再次请求电子邮件权限

ios - UIImageView 重复显示在另一个单元格中

iphone - 通过 iOS 6 应用程序以编程方式在 facebook 上分享视频?