UIManagedDocument может только читать документы, которые являются пакетами файлов - PullRequest
4 голосов
/ 09 декабря 2011

Мое приложение использует базу данных SQLite с основными данными.Я бы хотел, чтобы мои пользователи могли использовать iCloud для синхронизации между устройствами - и я подумал, что мог бы использовать UIManagedDocument.

Я вложил его в подкласс, следуя документации Apple, и он работает, когда нужен новый файл постоянного хранилищабыть созданным.Однако, когда я пытаюсь использовать его для открытия моего старого файла постоянного хранилища, я получаю следующую ошибку:

"UIManagedDocument может только читать документы, являющиеся пакетами файлов"

Означает ли эточто мне нужно перенести старое постоянное хранилище в новое хранилище, управляемое UIManagedDocument?Если да, то нужно ли это делать вручную (т.е. читать каждую запись по одному из старого хранилища и записывать ее в новое)?

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 11 декабря 2011

UIManagedDocument создает пакеты (папки), а не атомарные хранилища. Магазин все еще там, но его похоронили в упаковке. Если вы щелкните правой кнопкой мыши файл, созданный в папке «Документы» в симуляторе, вы сможете увидеть структуру. По умолчанию

mydocument.foo
   -> StoreContent
      -> persistentStore

Что вам нужно сделать, это создать новое расширение для типа файла вашего приложения, так что, например, если расширение вашей базы данных .myappdb, вам нужно создать новый тип документа в настройках вашего проекта, который может быть .myappdbw. Вы можете скопировать все настройки из записи для .myappdb

Далее, в точке, где вы обрабатываете открытие унаследованного документа по адресу mydocumenturl, вместо того, чтобы передавать его координатору постоянного хранилища, вы создаете структуру каталогов выше. * * 1010

NSURL *newurl = [[mydocumenturl  URLByDeletingPathExtension] URLByAppendingPathExtension:@"myappdbw"];
NSURL *desturl = [newurl URLByAppendingPathComponent:@"StoreContent"];
[[NSFileManager defaultManager] createDirectoryAtURL:desturl withIntermediateDirectories:YES attributes:nil error:NULL];
NSURL *finalurl = [desturl URLByAppendingPathComponent:@"persistentStore"];

, а затем переместите устаревшую базу данных в созданную вами систему папок

[[NSFileManager defaultManager] moveItemAtURL:mydocumenturl toURL:finalurl error:NULL];

и затем вы можете передать URL пакета в UIManagedDocument

UIManagedDocument *doc = [[UIManagedDocument alloc] initWithFileURL:newurl];

Ссылка, которая будет полезна для интеграции с iCloud:

http://developer.apple.com/library/ios/#releasenotes/DataManagement/RN-iCloudCoreData/_index.html

Все это немного загадочно, так как большая часть обещанного примера кода так и не появилась, но, с другой стороны, его довольно просто вывести. Посмотрите сессии WWDC2011 107,116 и 315 для получения дополнительных подсказок.

Но учтите, что если вы собираетесь использовать этот метод для переноса устаревших документов DONT , установите NSPersistentStoreUbiquitousContentNameKey в точке, которую вы переносите, потому что пакет меняется, когда вы это делаете. Документ выше описывает это довольно хорошо.

1 голос
/ 11 декабря 2011

Спасибо за этот совет.Я думаю, что нашел еще более простое решение.

Я просто создаю новый UIManagedDocument с именем файла, отличным от моего старого постоянного места хранения.

В моем подклассе UIManagedDocument я переопределяюconfigurePersistentStoreCoordinatorForURL метод и выполните миграцию, как только там:

- (BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)storeURL ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError **)error
{
    // If legacy store exists, copy it to the new location
    NSFileManager* fileManager = [NSFileManager defaultManager];
    if ([fileManager fileExistsAtPath:legacyPersistentStoreURL.path])
    {
        NSError* thisError = nil;
        [fileManager copyItemAtURL:legacyPersistentStoreURL toURL:storeURL error:&thisError];
        [fileManager removeItemAtURL:legacyPersistentStoreURL error:&thisError];
    }

    return [super configurePersistentStoreCoordinatorForURL:storeURL ofType:fileType modelConfiguration:configuration storeOptions:storeOptions error:error];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...