公司的項目屬於大型的綜合型項目,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的操作。對於開源框架不僅要懂得怎麼用,還要懂得怎麼改,這些都要自己付出一些努力,不能只停留在使用工具層次。程序不易,且行且珍惜。