ios - Core Data 自定义元数据不为 iCloud 存储保存

标签 ios core-data metadata icloud

我正在尝试将一些自定义元数据保存到支持 iCloud 的 Core Data SQLite 存储中。该文档似乎说除了它生成的元数据之外,我应该能够设置我自己的自定义元数据——类似于 NSUserPreferences,但附加到我的核心数据存储。看起来应该很简单:

NSManagedObjectContext* moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[moc setPersistentStoreCoordinator:psc];

NSMutableDictionary* metadata = [[psc metadataForPersistentStore:store] mutableCopy];
metadata[@"testKey"] = @"testValue";
[psc setMetadata:metadata forPersistentStore:store];
[moc save:&error];

因此,在此运行之后,我的自定义元数据键/值在商店的元数据字段中可见。但是,当我重新启动应用程序时,我添加的元数据不再存在(但 iCloud 元数据存在)。请注意,这在使用常规非 iCloud 商店时可以正常工作,因此它看起来是特定于 iCloud 的。

附加信息:

假设我获取元数据,添加我的自定义字段,然后使用静态方法保存它:

[NSPersistentStoreCoordinator setMetadata:metadata forPersistentStoreOfType:NSSQLiteStoreType URL:self.coreDataController.iCloudStore.URL error:&error];
NSDictionary* reviewMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:self.coreDataController.iCloudStore.URL error:&error];

reviewMetadata 变量包含带有我添加的字段的元数据。但是,一旦我重新启动应用程序(并因此重新加载商店),它就会恢复到原来的状态。我什至尝试在执行上述语句后立即设置断点并终止应用程序,当我重新启动应用程序时,我的自定义元数据仍然消失。

有什么想法吗?我是否错误地使用了元数据?这不适用于支持 iCloud 的商店吗?

最佳答案

这似乎对我有用,但它在 OS X 上运行。尚未在 iOS 上尝试过相同的方法。

- (void)setiCloudMetaDataForStore:(NSURL*)fileURL ofType:(NSString *)fileType iCloud:(bool)iCloudEnabled ubiquityName:(NSString*)ubiquityName {
    //LOG(@"setiCloudMetaDataForStore called...");

    NSError *error;
    NSDictionary *metaData = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:fileType URL:fileURL error:&error];

    if (!metaData) {
        FLOG(@" problem getting metaData");
        FLOG(@"  - error is %@, %@", error, error.userInfo);
    }

    //FLOG(@" metaData is %@", metaData);

    //Now see if we can add a setting to indicate it is iCloud enabled
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithDictionary:metaData];

    [dict setObject:[[NSNumber alloc] initWithBool:iCloudEnabled] forKey:@"iCloudEnabled"];

    if (!iCloudEnabled)
        [dict removeObjectForKey:NSPersistentStoreUbiquitousContentNameKey];
    else
        [dict setObject:ubiquityName forKey:NSPersistentStoreUbiquitousContentNameKey];

    bool result = [NSPersistentStoreCoordinator setMetadata:dict forPersistentStoreOfType:fileType URL:fileURL error:&error];

    if (!result) {
        FLOG(@" problem setting metaData");
        FLOG(@"  - error is %@, %@", error, error.userInfo);
    }

    return;
}

关于ios - Core Data 自定义元数据不为 iCloud 存储保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20436960/

相关文章:

ios - 使用Swift的iOS Shoutcast访问元数据

ios - swift 4 : Scanning QR codes with dictionary inputs

ios - 如何在任何 Facebook 帐户上分享图像?

ios - 迁移核心数据错误代码 134130

core-data - 我需要做什么才能让 Core Data 自动迁移模型?

MySQL 与 XML 的标记机制

oracle - 如何查询Oracle目录的权限?

iphone - 创建一个类以从 Web 服务上的异步调用返回数据

iphone - 同一 viewController iphone 上的多个 Web 服务调用

ios - 用 NSFileManager 替换 CoreData persistantStore 是否安全?