今天開發的時候遇到一個用例,簡單描述就是在刪除一張表裏面某條數據的同事,要刪除另外的一張表,注意是一張表,而不是記錄。
代碼實現:
/**
* 刪除單個對話以及對話包含的消息表
* @param uuid
* @return
*/
public boolean deleteSingleChat(long uuid){
Statement st = null;
Database db = super.getSQLiteDatabase();
try {
db.beginTransaction();
st = db.createStatement(DELETE_CHAT_SQL);
st.prepare();
st.bind(1, uuid);
st.execute();
st.close();
st = db.createStatement(DROP_MSG_TABLE + MsgSchema.MSG_TABLE_NAME_HEAD + uuid + ";");
st.prepare();
st.execute();
db.commitTransaction();
return true;
} catch (DatabaseException e) {
return false;
}finally{
super.closeStatement(st);
}
}
這裏需要注意的就是你必須要開啓事務來保證業務的一致性。
所以需要
db.beginTransaction();
.....
db.commitTransaction();
那麼在事務中有任何的問題和異常,sqlite都會回滾操作。
其次還應該注意對Statment的打開和關閉的時機,請注意,因爲我要在事務裏面操作兩張表,也就是我需要兩個Statment
st = db.createStatement(DROP_MSG_TABLE + MsgSchema.MSG_TABLE_NAME_HEAD + uuid + ";");
st = db.createStatement(DELETE_CHAT_SQL);
那麼當我在第一次使用st之後,我必須要st.close(),然後在開啓第二個st的時候仍然需要st.prepare();這樣才能保證第二次正常的引用st對象。
還有就是在代碼的finally裏面要對st及時的關閉,避免內存泄漏。