Android SQLite - 升级过程中失败的事务后删除表

时间:2016-12-01 10:58:38

标签: android sqlite

在SQLite升级期间,事务失败后,drop table没有执行任何操作。 drop SQL不会抛出异常。

我能让它工作的唯一方法是删除与事务有关的所有事情,但我希望数据库不变,以分析升级过程中出现的问题。

private void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
  try {
      db.beginTransaction();
      // Exception occurs here
      db.setTransactionSuccessful();
      db.endTransaction();
  }catch(Exception e){
      db.endTransaction(); // Transaction is unsuccessful and changes rolled back
      // Save for analyses
      db.execSQL("DROP TABLE ..."); // Drop table does nothing
  }
}

4 个答案:

答案 0 :(得分:1)

SQLiteOpenHelper生命周期方法(例如onUpgrade())在事务中执行。 sqlite不支持嵌套事务,Android的SQLiteDatabase仅模拟带引用计数的嵌套事务,但这样的模拟嵌套事务实际上并不是真正的事务。

如果生命周期方法中存在问题,请抛出异常,框架将为您回滚最外层的实际事务。

答案 1 :(得分:0)

调用endtransaction后执行删除表查询。检查订单。这可能是原因。

答案 2 :(得分:0)

在事务和endTransaction之间有什么样的代码,如果它是execSQL(),你需要捕获异常SQLException,如果你使用插入,请使用insertOrThrow(),请不要期望Exception e将捕获所有异常..

答案 3 :(得分:0)

onUpgrade已经在事务块中。为了使这项工作我想要它(虽然它结束了一个它没有开始的事务):

// Path to db on local storage
private String mDbToUpload = null;

@Override
private void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
  try {
      // Exception occurs here
  }catch(Exception e){
      db.endTransaction(); // End transaction to rollback changes
      mDbToUpload = ...// Save db to local storage
  }
}

@Override
private void onOpen(SQLiteDatabase db){
  if(mDbToUpload != null){
    ... // Upload db from path
    mDbToUpload = null;
  }
}