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

Posted

技术标签:

【中文标题】未启用 iCloud 时如何存储核心数据日志?【英文标题】:How do I store core data logs when iCloud isn't enabled? 【发布时间】:2012-12-10 23:51:45 【问题描述】:

我希望用户能够在禁用 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];

【问题讨论】:

我建议你在 Apple 的私人论坛上发布这个帖子——我在那里看到了很多关于这类事情的问题,不幸的是,没有很多答案。如果没有任何响应,请刻录 DTS 事件(您每年获得两次)并从 Apple 获得真正的帮助。 当你说“日志”时,你指的是Core Data在你使用iCloud时创建的事务日志吗? @TomHarrington 正确。是否有可能在没有启用 iCloud 的情况下创建那些? 【参考方案1】:

很遗憾,这不是一个选项。当启用 iCloud并且您使用 NSPersistentStoreUbiquitousContentNameKey 时,会自动创建 Core Data 事务日志。在其他所有情况下,都不会创建任何事务日志。如果未启用 iCloud,您的代码无法强制创建日志。在尝试将 iCloud 与 Core Data 结合使用时,这种情况只是许多意想不到的复杂情况之一。

一种可能的方法:当您发现 iCloud 已启用时,将您的整个数据存储迁移到 iCloud,而不必担心是否已经存在任何内容。然后,使用重复检测方法清除重复条目。 Apple 在其SharedCoreData 示例项目中提供了一个很好的重复检测代码示例,在 WWDC 2012 第 227 场会议中进行了介绍,Using iCloud with Core Data

另一种方法是在禁用 iCloud 时维护您自己的更改日志。使用NSManagedObjectContextDidSaveNotification 监视更改,并保留您自己的在禁用 iCloud 时更改的对象列表。如果 iCloud 重新启用,您可以重新保存这些对象,以便为它们生成 iCloud 事务。

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

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

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

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

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

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

【讨论】:

我不知道为什么这被否决了,这一切都是准确的,并且基于我自己使用 iCloud 的经验。

以上是关于未启用 iCloud 时如何存储核心数据日志?的主要内容,如果未能解决你的问题,请参考以下文章

iCloud 核心数据未同步第二台设备上的所有记录

仅为 OS X 10.8.x 和 iOS 6.x 在 iCloud 中启用核心数据同步

合并 iCloud 和核心数据数据库

为 iOS 应用程序的文件启用 iCloud Drive 文件夹

如何阻止核心数据同步到 iCloud

如何在 iCloud 未启用时保存文件,然后启用