關於blackberry平臺下sqlite事務的處理方式

今天開發的時候遇到一個用例,簡單描述就是在刪除一張表裏面某條數據的同事,要刪除另外的一張表,注意是一張表,而不是記錄。

代碼實現:

/**
	 * 刪除單個對話以及對話包含的消息表
	 * @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及時的關閉,避免內存泄漏。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章