Android之afinal框架的DB——刪除數據表Bug

公司的項目屬於大型的綜合型項目,Android開發部就有二十多號個人,可見項目的更新迭代之快。然而項目中使用了一些開源的框架,比如afinal,隨着運營的時間,afinal框架版本一直沒有升級,這時候就需要自己去修復這些開源框架的bug了。最近接到產品部新需求,需要在各個功能塊的二級首頁增加緩存功能,接到任務後評估了一下,任務級別爲二級,開發難度級別爲三級,就直接建立任務安排了一下。本來以爲挺簡單一個任務,但團隊開發時遇到afinal刪除表後再創建表報異常了,一時都沒有解決,沒有辦法只有自己跟進下問題了。

問題原因:在更新數據表時考慮數據結構的不一致性採取先dropTable在createTable,在進行這兩步操作時都拋出了異常。

看了下FinalDB.java源碼:

/**
	 * 刪除指定的表
	 *
	 * @param clazz
	 */
	public void dropTable(Class<?> clazz) {
		checkTableExist(clazz);
		TableInfo table = TableInfo.get(clazz);
		String sql = "DROP TABLE " + table.getTableName();
		debugSql(sql);
		db.execSQL(sql);
	}

這個dropTable方法沒有對數據庫操作進行異常處理,將sql語句修改了下:

String sql = "DROP TABLE IF EXISTS " + table.getTableName();
然而afinal框架中有數據表的緩存,這點估計許多開發人員都沒有注意到,執行sql語句刪除了物理表,那緩存表也的同步下,不然後面的邏輯會在檢查表存在操作時拋出相關的表不存在等異常,既然這樣就需要修改下TableInfo.java源碼,增加刪除指定表緩存方法:

/**
	 *
	 * 進行刪除表操作時需要調用此方法刪除表名緩存
	 * @param clazz
	 */
	public static void dropTable(Class<?> clazz){
		if(null != tableInfoMap)
			tableInfoMap.remove(clazz.getName());
	}
結合上面修改下dropTable方法如下:

/**
	 * 刪除指定的表
	 *
	 * @param clazz
	 */
	public void dropTable(Class<?> clazz) {
		checkTableExist(clazz);
		TableInfo table = TableInfo.get(clazz);
		// modify by zhsf@2016-2-17 刪除表時判斷是否存在
		String sql = "DROP TABLE IF EXISTS " + table.getTableName();
		debugSql(sql);
		db.execSQL(sql);
		// add by zhsf@2016-2-17
		TableInfo.dropTable(clazz);
	}
這樣就解決了afinal對DB的操作。對於開源框架不僅要懂得怎麼用,還要懂得怎麼改,這些都要自己付出一些努力,不能只停留在使用工具層次。程序不易,且行且珍惜。



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