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



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