在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
}
}
答案 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;
}
}