奇怪的SQLite行为

时间:2009-06-27 16:54:25

标签: iphone sqlite

我将数据插入表中,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!");

所以我想知道为什么要调用最后提到的日志函数。这意味着在添加数据后,表中没有数据。有时它会增加,有时则不会。

问题出在哪里? 提前谢谢。

更新: 我发现只有在创建新数据库时才会发生这种情况。重新启动应用程序后,它以正确的方式工作。但是如果创建了一个新的数据库,就会出现奇怪的行为。

1 个答案:

答案 0 :(得分:2)

Sqlite默认在自动提交模式下运行,但是我们无法知道某些先前的交互或设置是否可以重置该模式;如果您在COMMIT之后添加明确的INSERT,是否有帮助?

编辑:可能不是,从评论中提供更多信息,但是如果您确实需要在其他情况下提交,最简单的方法是:

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

使用通常的结果代码& c(在您使用它指向的错误消息后,您需要sqlite3_free(errmsg)。)