Странное поведение SQLite - PullRequest
1 голос
/ 27 июня 2009

Я вставляю данные в таблицу, и sqlite3_step возвращает SQLITE_DONE. Но иногда в таблице нет новых данных! Даже если я выполню проверку сразу после добавления данных.

Вот мой код:

sqlite3_stmt *addTranslationStmt2 = NULL;

if(sqlite3_prepare_v2( database , "INSERT INTO translations(lang1_wordid, lang2_wordid) VALUES(?, ?)" , -1, & addTranslationStmt2, NULL) != SQLITE_OK)
{
  NSLog(@"statement prepare error");
  addTranslationStmt2 = NULL;
  return -1;
}

sqlite3_bind_int(addTranslationStmt2, 1, word_id);
sqlite3_bind_int(addTranslationStmt2, 2, translation_id);

if(sqlite3_step(addTranslationStmt2) != SQLITE_DONE)
{
  NSLog(@"addTranslationStmt2 error: '%s'", sqlite3_errmsg(database));
  sqlite3_reset(addTranslationStmt2);
  return -1;
}

sqlite3_reset(addTranslationStmt2);

if (![self wordHasTranslation: word_id translation_id: translation_id])
  NSLog(@"And after all translation was not added even though sqlite3_step returns SQLITE_DONE!");

Поэтому мне интересно, почему вызывается последняя упомянутая функция журнала. Это означает, что после добавления данных в таблице отсутствуют данные. Иногда это добавляет, а иногда нет.

Где может быть проблема? Заранее спасибо.

UPDATE: Я обнаружил, что это происходит только при создании новой базы данных. После перезапуска приложения оно работает правильно. Но если создается новая база данных, странное поведение возвращается.

1 Ответ

2 голосов
/ 27 июня 2009

Sqlite работает по умолчанию в режиме автоматической фиксации, но у нас нет возможности узнать, могло ли какое-то предыдущее взаимодействие или настройка сбросить это; если вы добавите явное COMMIT после INSERT, это поможет?

Изменить: возможно, нет, дать дополнительную информацию из комментариев, но на тот случай, если вам понадобится зафиксировать в других обстоятельствах, самый простой способ:

char* errmsg;
int result = sqlite3_exec(database, "COMMIT", NULL, NULL, &errmsg);

с обычными кодами результата & c (вам нужно будет sqlite3_free(errmsg) после того, как вы использовали сообщение об ошибке, на которое оно указывает, если оно есть).

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