Android SQLite大数据存储优化
我们都知道SQLite是一个轻量级的数据库,在批量存储大数据的时候很受性能的限制。而在android开发中如果存储数据的效率过慢的话,就会造成程序运行的卡顿,用户体验会很不好。我们都说数据库存储的时候要通过开启事务来进行存储,这样能提高存储的效率,但我们也得知道的是频繁的开关事务是最消耗性能的,所有我这里优化的原则是-减少事务的开启与关闭。
保存公司信息到数据库,从代码里面初步的看没有任何问题,运行也没有出现任何问题,但当项目中的数据达到上万后问题就暴露出来了。由于需要把上万个公司存到数据库,优化前的做法就是遍历List,然后调用addBathCompanyData去存储,而此时程序出现了明显的卡死,通过跟踪发现此处上万条数据全部执行完成需要恐怖的四十多秒,你没有看错,就是四十多秒,这个问题可想而知。
public boolean addBathCompanyData(ChatCompany chatCompany) {
try {
mDB.beginTransaction();
final String sql = "INSERT INTO company VALUES(NULL,?,?,?,?,?,?)";
Object[] objects = new Object[]{chatCompany.getCompanyId(), chatCompany.getCompanyIcon(),
chatCompany.getCompanyName(), chatCompany.getCompanyNameLang(),chatCompany.getIsFollow(),chatCompany.getCompanyCode()};
mDB.execSQL(sql, objects);
mDB.setTransactionSuccessful();
} catch (Exception e) {
Log.e("addCompanyData", e.toString());
return false;
} finally {
if (mDB.inTransaction()) {
mDB.endTransaction();
}
}
return true;
}
我们对比优化前后的代码,其实的没有别的变化,只不过是把循环遍历list放到了addBathCompanyData方法里面,而把事务的开启mDB.beginTransaction();放到了循环之外,这样即使存储上万条数据,事务也只会开启和关闭一次。当然效果也是显著的,优化后的执行时间只需要0.2秒的时间。相信这个速度暂时肯定是够用了。
public boolean addBathCompanyData(List<ChatCompany> chatCompanys) {
try {
mDB.beginTransaction();
for (ChatCompany chatCompany:chatCompanys) {
ChatCompany chatCompany1 = getCompanyById(chatCompany.getCompanyId());
if (StringUtils.isNotBlank(chatCompany1.getCompanyId())){
updateCompany(chatCompany);
return true;
}
final String sql = "INSERT INTO company VALUES(NULL,?,?,?,?,?,?)";
Object[] objects = new Object[]{chatCompany.getCompanyId(), chatCompany.getCompanyIcon(),
chatCompany.getCompanyName(), chatCompany.getCompanyNameLang(),chatCompany.getIsFollow(),chatCompany.getCompanyCode()};
mDB.execSQL(sql, objects);
}
mDB.setTransactionSuccessful();
} catch (Exception e) {
Log.e("addCompanyData", e.toString());
return false;
} finally {
if (mDB.inTransaction()) {
mDB.endTransaction();
}
}
return true;
}
ps:发布应用中的实际应用,真实有效