Как обновить БД SQLite при обновлении приложения iPhone? - PullRequest
11 голосов
/ 04 мая 2010

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

Когда открывается соединение с локальной базой данных приложения, код проверяет, чтобы убедиться, что файл базы данных существует в папке «Документы», если это не так, база данных создается путем копирования из папки «Ресурсы» в Папка «Документы».

Я должен выпустить обновление приложения. Обновление содержит изменения схемы базы данных (новые таблицы, столбцы и т. Д.). Из того, что я прочитал, файлы в каталоге «Документы» будут сохраняться при обновлении приложения, а это значит, что существующая база данных останется нетронутой после обновления.

Мой вопрос: как заменить существующую базу данных моей обновленной базой данных, и есть ли способ сделать это без потери данных в существующей базе данных? Существует ли какое-либо событие «первый запуск после обновления», с которым я могу работать, чтобы выполнить обновление базы данных, или мне нужно выполнить какую-то проверку существующей базы данных (поиск новой колонки или таблицы), и если моя проверка не удалась вручную заменить / обновить базу данных?

Спасибо!

Ответы [ 3 ]

17 голосов
/ 05 мая 2010

Текущий номер версии приложения должен храниться где-то постоянно - в базе данных или, что еще лучше, в базе данных по умолчанию. При запуске ваше приложение будет сравнивать собственный номер версии с постоянным номером версии. Если они отличаются, то это первый запуск после обновления. Если номер сохраненной версии отсутствует, то, очевидно, это также первый запуск после обновления.

Что касается обновления вашей базы данных, если бы она была на месте, вы бы использовали обычные команды SQL ALTER для обновления вашей схемы и одновременно выполняли перенос данных любой базы данных.

4 голосов
/ 13 августа 2012

sqlite3 * база данных;sqlite3_stmt * update_statement = nil;

if(sqlite3_open([strDatabasePath UTF8String], &database) == SQLITE_OK)
{
   nsstring  *strMQueryupdate="write your query here";

    const char *sql = [strMQueryupdate UTF8String];

    if (sqlite3_prepare_v2(database, sql, -1, &update_statement, NULL) != SQLITE_OK) {
        NSLog(@"update fails");
    }
    else
    {
        sqlite3_bind_text(update_statement, 1, [[arrayname objectAtIndex:0]  UTF8String], -1, SQLITE_TRANSIENT);


        int success = sqlite3_step(update_statement);
        sqlite3_reset(update_statement);
        if (success == SQLITE_ERROR){}
        else {}
    }
    sqlite3_finalize(update_statement);
}
sqlite3_close(database);   
3 голосов
/ 05 мая 2010

Мы проверяем наличие обновлений, запрашивая у сервера значение хеша в заголовке plist, который выкладывается через php-файл, который запрашивает базу данных сервера. Вы можете сохранить этот хеш локально и сравнить его с последним запуском приложения. Таким образом, телефон узнает, устарела ли его версия. Затем мы загружаем новый plist в фоновом режиме и обновляем базу данных на телефоне.

EDIT:

В конце нашего php мы получаем MD5 XML-вывода plist, который мы генерируем на сервере, вот так:

header("MD5-Hash: ". md5($xml_output));
echo $xml_output;

Затем мы получаем хэш plist на iPhone от userDefaults, например, так:

NSUserDefaults* defaults  = [NSUserDefaults standardUserDefaults];
curHash = [defaults stringForKey:kUpdateUserDefault];

И хеш сервера от NSURLRequest, вот так:

NSString *hash = [[[res allHeaderFields] objectForKey:kUpdateHeaderField] retain];

Затем мы сравниваем их и начинаем загрузку, только если хэши не совпадают:

    if (![curHash isEqualToString:hash]) {
            [self performSelector:@selector(sendUpdateStarted) onThread:[NSThread mainThread] withObject:nil waitUntilDone:NO];
            ... download the file and save it as the new iPhone's plist
    }

Этот код написан моим очень способным партнером, Оливером Райсом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...