Различный путь к созданной базе данных sqlite для симулятора iPhone и iPad - PullRequest
1 голос
/ 10 января 2012

У меня здесь странная проблема.Недавно мы добавили функциональность iPad в существующее приложение для iPhone.И однажды приложение не запустилось в симуляторе iPad.Причина в том, что в симуляторе iPad путь к базе данных SQLite отличается.

Работает следующий сценарий: я запускаю приложение в симуляторе iPhone 5.0, позволяю создать базу данных.Затем я запускаю ту же цель в симуляторе iPad, проходит проверка, существует ли файл базы данных, и запускается ли приложение.

Когда я удаляю приложение из симулятора iPhone и сначала запускаю его на симуляторе iPad, происходит сбой, посколькуpersistentStoreCoordinator не создается.

Путь к базе данных извлекается в [MyAppAppDelegate persistentStoreCoordinator] следующим образом:

NSString *databasePath = [[MyApplication sharedApplication] databaseFilePath];

И соответствующие методы для этой строки:

- (NSString *)applicationDocumentsDirectory {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; // objectAtIndex:0 didn't make any difference
}

- (NSString *)databaseFilePath {
    NSString *databasePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MyApp_v3.sqlite"];
    return databasePath;
}

Печать пути к базе данных показывает следующее для для iPad и iPhone:

/Users/swramba/Library/Application Support/iPhone Simulator/5.0/Applications/ABF391C4-FCFF-4274-8FD1-E560C2FB58D9/Documents/MyApp_v3.sqlite

А теперь настоящая проблема ...

Однако, когда я позволяю iPad создать базу данных, файл sqlite находится не по этому пути, а в подкаталоге _Content папки Documents.

Почему iPad Simulator помещает его туда?а симулятор айфона нет?И почему он так делает, когда databaseFilePath одинаково в обоих симуляторах?

Любая помощь с благодарностью!

С уважением, Себастьян

edit 1:

Именно здесь должен быть создан persistentStoreCoordinator , но приложение никогда не достигает этого кода на симуляторе iPad.(Поскольку он сначала проверяет, существует ли файл => НЕТ, затем он проверяет, создается ли база данных => НЕТ, установите для isCreatingDatabase значение ДА (переключитесь, чтобы отобразить представление предупреждений). В следующий раз получатель persistentStoreCoordinator получаетвызван, файл все еще не существует, но он создал его, но не там, где он должен быть (_Content subdir)

if (persistentStoreCoordinator != nil) {
    return persistentStoreCoordinator;
}

NSURL *storeUrl = [NSURL fileURLWithPath:databasePath];
NSLog(@"SB Store URL: %@", storeUrl);

NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}    

return persistentStoreCoordinator;
...