1

私は2つのトランザクションを実行します。

最初のトランザクションではテーブル test が作成されますが、このトランザクションのロールバックと言います。

私は、テーブルテストが作成されているかどうかにかかわらず、その間にあるべきではないと思います。

次に、他のトランザクションを実行して、何が起こったかをテストします。

テーブル テストに 1 行挿入します。それはプログラムで動作しているように見えますが、sqlite プロンプトに移動すると、コマンド「.schema」と言ったときにそこにテーブル テストが表示されません。

誰かが何が起こっているのか教えてもらえますか?

私のコードの出力は次のとおりです。

    try
    {
      db.beginTransaction();

      String s =
      "CREATE TABLE test(id INTEGER PRIMARY KEY AUTOINCREMENT ,age INTEGER)";
      db.execSQL(s);
    }
    catch (Exception e)
    {
      System.out.println("Exception 1:"+e);
    }
    finally
    {
      db.endTransaction();
    }


    try
    {
      db.beginTransaction();
      db.execSQL("INSERT INTO test VALUES(NULL,22)");
      db.setTransactionSuccessful();
      System.out.println("Insert ok.");
    }
    catch (Exception e)
    {
      System.out.println("Exception 2:"+e);
    }
    finally
    {
      db.endTransaction();
    }
4

1 に答える 1

0

誰かが何が起こっているのか教えてもらえますか?

それは正常な動作です。TRANSACTION挿入が実行されなかっただけでなく、コミットもしなかったため、テーブルは作成されませんでした。結果が出ている理由

System.out.println("Insert ok.");

execSQL() メソッドは、クエリ文字列が無効/壊れている場合にのみ SQLException をスローします。また、挿入に execSQL() を使用することはできません。テーブルの変更にのみ使用できます。

SELECT/INSERT/UPDATE/DELETE ではない単一の SQL ステートメントを実行します。

解決:

execSQL()void 型なので、メソッドを使用して結果をテストする必要がありAPIますinsert()

long rowId = db.insert("test", <nullColumnHack>, values);
if (rowId < 0) {
    // error
}
于 2013-03-28T20:38:42.380 に答える