Ответ Шези очень помог, но, как и другие, здесь: Предварительно загруженная база данных базовых данных в ios5 с UIManagedDocument и здесь: Предварительно загруженная база данных базовых данных становится черным с UIManagedDocument У меня былопроблемы.
Во-первых, поведение на симуляторе заметно отличается от поведения на устройстве.Если вы создаете экземпляр UIManagedDocument, используя initWithURL
, где URL-адрес указывает на комплект приложений, вы получите предупреждение о том, что это каталог, доступный только для чтения, в консоли при запуске на устройстве, но на симуляторе такого предупреждения не появляется.Обработка разрешений кажется совершенно другой, и вы можете получить разные результаты.
В документах предлагалось использовать migratePersistentStore:toURL:options:withType:error:
вместо [doc saveToURL:newURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success){}]
Я потратил много времени, пытаясь получить этоработать, но было много проблем с получением указателя на постоянное хранилище.Несмотря на то, что мое приложение отлично работало для операций только для чтения после выполнения решения Шези, координатор постоянного хранилища продолжал давать мне нулевой указатель на постоянное хранилище.Это произошло, когда я попробовал и – persistentStores
(который возвратил пустой массив) и – persistentStoreForURL:
Если кто-нибудь может объяснить, почему это произошло, мне было бы интересно.Раздражает то, что иногда он работает на симуляторе, но когда я тестировал его на устройстве, он не удался.
В конце концов, я все изменил и сначала скопировал папку bundle в каталог документов, а затемсоздание экземпляра UIManagedDocument.Это, кажется, добилось цели.Вот кодПредполагается, что ваш UIManagedDocument является свойством класса.Я поместил это в метод viewWillAppear начального контроллера представления.Помните, что вам нужно открыть документ, если вы создаете экземпляр с использованием URL-адреса, содержащего существующее постоянное хранилище.
if (!self.yourUIManagedDocument) {
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *bundlePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"yourUIManagedDocument"];
NSString *documentsFolderPath = [documentsDirectory stringByAppendingPathComponent:@"yourUIManagedDocument"];
NSURL *documentsUrl = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
documentsUrl = [documentsUrl URLByAppendingPathComponent:@"yourUIManagedDocument"];
if (![[NSFileManager defaultManager] fileExistsAtPath:documentsFolderPath]) {
NSError *error = nil;
if([[NSFileManager defaultManager] copyItemAtPath:bundlePath
toPath:documentsFolderPath
error:&error]) {
self.yourUIManagedDocument = [[UIManagedDocument alloc] initWithFileURL:documentsUrl];
[self.yourUIManagedDocument openWithCompletionHandler:^(BOOL success) {
}];
} else {
NSLog(@"%@", error);
}
} else {
self.yourUIManagedDocument = [[UIManagedDocument alloc] initWithFileURL:documentsUrl];
[self.yourUIManagedDocument openWithCompletionHandler:^(BOOL success) {
}];
}
} else if (self.yourUIManagedDocument.documentState == UIDocumentStateClosed) {
//Document is closed. Need to open it
[self.yourUIManagedDocument openWithCompletionHandler:^(BOOL success) {
}];
}
Конечно, вышеизложенное предполагает, что вы уже сгенерировали базу данных с помощью симулятора и скопировали каталог вкомплект приложений точно так, как описала Шези.Любые комментарии или предложения по улучшению кода приветствуются.Я все еще учусь здесь.