繁体   English   中英

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

[英]How do I store core data logs when iCloud isn't enabled?

我希望用户能够在禁用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:一步完成此操作,但您必须执行此操作。 (顺便说一下,有可能只是弄乱数据存储的元数据,但这没有记录,我不知道要消除哪些键)。

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

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

  4. 根据我的经验 - 使用iCloud的核心数据很不稳定 除其他外, 一定要检查addPersistentStoreWithType:etc的返回值,因为它可能会因为没有明显的原因而失败(即你做的一切都正确,但iCloud只是没有表现)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM