В прошлом я выпустил свое приложение с предустановленной базой данных, поэтому пользователю не нужно было его обновлять при первом запуске. Был какой-то код, который я нашел в другом вопросе на SO (к сожалению, не имеют связей в малейших), что я добавил к моему persistentStoreCoordinator
методу App делегата:Предварительная загрузка базы данных в iOS 7
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"db.sqlite"];
if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]])
{
NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"db" ofType:@"sqlite"]];
NSError* err = nil;
if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&err])
{
NSLog (@"Error - Could not preload database.");
}
}
//... more code generated from the template here
}
Когда я пытаюсь сделать это в прошивке 7, я не получайте никаких ошибок, но база данных пуста (хотя база данных в моем mainBundle
имеет всю информацию, которую я ожидаю). Я заметил, что в файле applicationDocumentsDirectory
есть больше файлов базы данных (файл .sqlite-shm и файл .sqlite-wal). Нужно ли мне что-то делать с этими файлами? Или уже невозможно иметь предварительно загруженный корабль базы данных с приложением?
EDIT: Я попытался добавить код, чтобы скопировать новые файлы .sqlite-shm и .sqlite-wal, но это не помогает.
Да, добавив, что 'options' словарь делает трюк. Я посмотрю видео, которое вы связали, и, надеюсь, это не то, что мне в итоге нужно =). В противном случае, я думаю, мне придется найти другое решение, но сейчас это работает. – GeneralMike
WAL повышает производительность в многопоточных приложениях, поэтому будьте внимательны при изменении режима журнала. Однако я не знаю точно, как отправить предварительно заполненную базу данных с поддержкой WAL. –
@DavidCaunt: Я не слишком беспокоюсь о производительности для своего приложения на данный момент. Операции с базой данных были довольно медленными в предыдущей версии моего приложения, но я значительно урезал множество моих таблиц, чтобы устранить потраченное впустую пространство и изменил мои выборки, чтобы лучше получить информацию, которая мне понадобится в сеансе. После этих изменений практически невозможно обнаружить задержку. Если что-то изменится, и производительность снова начнет страдать, я буду помнить, что еще раз посмотрю на WAL, - спасибо. – GeneralMike