我正在尝试将一些自定义元数据保存到启用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的商店不起作用吗?
答案 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文件。