Android SQLite大数据存储优化

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:发布应用中的实际应用,真实有效

https://blog.csdn.net/u014714188/article/details/100988869

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值