公司的项目属于大型的综合型项目,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的操作。对于开源框架不仅要懂得怎么用,还要懂得怎么改,这些都要自己付出一些努力,不能只停留在使用工具层次。程序不易,且行且珍惜。