我正在尝试将一些自定义元数据保存到支持 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/