不为iCloud存储保存核心数据自定义元数据

时间:2013-12-07 02:48:11

标签: ios core-data metadata icloud

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

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的商店不起作用吗?

2 个答案:

答案 0 :(得分:0)

这似乎对我有用,但这是在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;
}

答案 1 :(得分:0)

我看到元数据的更改(有时)保存在-wal和-shm文件中,这显然可以加速sqlite。我没有找到另一种方法来在.sqlite文件中获取元数据更改,而不是在打开sqlite存储时添加此选项:

NSDictionary *options = @{NSSQLitePragmasOption:@{@"journal_mode":@"DELETE"}};

使用此选项不会创建-wal和-shm文件,因此必须将所有内容都提交到.sqlite文件。