У меня есть приложение для iPhone, которое я разрабатываю, и когда оно запускается, я открываю соединение с базой данных SQLite и закрываю его, когда приложение завершается. База данных находится в папке документов приложения.
За время существования приложения я запускаю несколько операторов INSERT
и UPDATE
. Однако по какой-то причине мои UPDATE
операторы не сохраняются должным образом, как только приложение закрывается и затем перезапускается. Я правильно звоню sqlite3_prepare_v2
, sqlite3_step
и sqlite3_finalize
, поэтому я уверен, что транзакции должны быть завершены. Я добавил точки останова для всех этих трех функций, и все они в порядке, и все возвращают правильные значения.
Когда я закрываю приложение после обновления и заглядываю в каталог документов, я вижу другой файл базы данных с -journal после него. Означает ли это, что что-то не работает должным образом с точки зрения транзакций?
Я также заметил, что в моем методе applicationWillTerminate:
, когда я закрываю соединение с помощью sqlite3_close()
, он возвращает SQLITE_BUSY
. Почему это может быть?
Я боролась целый день, поэтому я очень надеюсь, что кто-то может указать мне правильное направление!
Вот мой код для выполнения запросов на обновление:
// Update statement
sqlite3_stmt *stmt;
char *query = "UPDATE records SET fielda = ? WHERE pkfield = ?;";
if (sqlite3_prepare_v2(database, query, -1, &stmt, nil) == SQLITE_OK &&
// Bind
sqlite3_bind_text(stmt, 1, [myNSStringVar UTF8String], -1, nil) == SQLITE_OK &&
sqlite3_bind_int(stmt, 2, recordID) == SQLITE_OK) {
// Execute
int ret = sqlite3_step(stmt);
if (ret == SQLITE_DONE) {
sqlite3_finalize(stmt);
}
}