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 回答