2013-12-07 3 views
4

Я пытаюсь сохранить некоторые пользовательские метаданные в хранилище SQLite с поддержкой iCloud. В документации, по-видимому, говорится, что в дополнение к метаданным, которые он создает, я должен иметь возможность устанавливать свои собственные метаданные, похожие на NSUserPreferences, но прикрепленные к моему хранилищу основных данных. Похоже, что это должно быть просто:Основные метаданные данных ядра не сохраняются для хранилища iCloud

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?

+1

Вы сохраняете, но что-то изменилось в 'moc'? Там может быть оптимизация, где, если 'hasChanges' является ложным, он ничего не делает. –

+0

Вы подтвердили, что как при записи, так и при чтении постоянного координатора хранилища относится к правильному контексту управляемого объекта? – Mundi

+0

Я добавил еще несколько кода, чтобы показать, что я использую правильный moc. Я также пробовал его на основной поток moc, и он все еще не работал. Я также попробовал это с помощью static setMetadata: forPersistentStoreOfType: URL: error: метод на NSPersistentStore. Все еще не повезло :( – kurtzmarc

ответ

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; 
} 
0

Я вижу, что изменения в метаданные (иногда) хранятся в -wal и -shm файлы, которые, по-видимому служат для ускорения SQLite. Я не нашел другой способ, чтобы получить мои изменения метаданных в файле .sqlite, чем добавить эту опцию при открытии SQLITE магазина:

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

Используя эту опцию в -wal и -shm файл не создается, так что все должен быть привязан к файлу .sqlite.

Смежные вопросы