Heloou,我试图做一个嵌套事务,但是抛出SqliteDatabaseLockedException,我不确定为什么......
数据源open()方法将可写数据库分配给它们各自的属性,以便稍后调用方法来操作数据。他们都使用SQLHelpder返回一个writableDatabase。
@Override
protected Boolean doInBackground(String... url) {
try {
clientDataSource.open();
movementDataSource.open();
clientDataSource.getDatabase().beginTransaction();
movementDataSource.getDatabase().beginTransaction();
if(sendMovements()) {
movementDataSource.getDatabase().setTransactionSuccessful();
clientDataSource.deleteAllClients();
}
updateDatabase(url[0]);
clientDataSource.getDatabase().setTransactionSuccessful();
} catch (JSONException e) {
//Treat Json Exception
} catch (IOException e) {
//Treat IOException
} catch (SQLException e) {
e.printStackTrace();
}finally {
movementDataSource.getDatabase().endTransaction();
clientDataSource.getDatabase().endTransaction();
}
return true;
}
答案 0 :(得分:0)
这是sqlite docs的形式,这就是它所说的
在EXCLUSIVE模式下开始交易。
交易可以嵌套。当外部事务结束时,该事务中完成的所有工作以及所有嵌套事务都将被提交或回滚。如果任何事务结束而没有标记为干净(通过调用setTransactionSuccessful),则将回滚更改。否则他们将被承诺。
以下是交易的标准惯用语:
db.beginTransaction();
try {
...
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
所以,除非你在调用成功后标记你的事务结束,否则会导致数据库锁定错误,最终这就是你的行为。
movementDataSource.getDatabase()setTransactionSuccessful(); //调用此函数后,结束此事务,否则将导致数据库锁定错误。