代码之家  ›  专栏  ›  技术社区  ›  Ilya Suzdalnitski

奇怪的sqlite行为

  •  1
  • Ilya Suzdalnitski  · 技术社区  · 15 年前

    我正在向表中插入数据,sqlite3_步骤返回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 回复  |  直到 15 年前
        1
  •  2
  •   Alex Martelli    15 年前

    默认情况下,sqlite在自动提交模式下运行,但是我们无法知道以前的一些交互或设置是否已经重置了它;如果您添加了一个显式的 COMMIT INSERT ,这有帮助吗?

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

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

    使用通常的结果代码&C(您需要 sqlite3_free(errmsg)