zoukankan      html  css  js  c++  java
  • android SQLite 批量插入数据慢的解决方案 (针对于不同的android api 版本)

       

    原地址 :http://www.cnblogs.com/wangmars/p/3914090.html 

     

      SQLite,是一款轻型的数据库,被广泛的运用到很多嵌入式的产品中,因为占用的资源非常少,二其中的操作方式几乎和我们接触的数据库不多,甚至只有几百K的他自然会被需求者青睐,下面讲一下在这样的轻型数据库中怎么对他进行一些读写操作。

      之前做选择联系人的时候出现如果一个手机里联系人超过2000的话,往数据库里面插入会非常耗时,不同的手机存储的条数不同,这个存储的数量和手机的内存有很大的关系,往往取决于手机内存,下面对于数据量大的情况来写一下sqlite的批量查询。

      SqLite 插入数据有几种

      第一种 :由于InsertHelper 这个类在android api17已经被废弃了,所以要是基于 之前开发的可以使用

     

    InsertHelper ih = new InsertHelper(db, "表名");
    db.beginTransaction();
    final int 列1= ih.getColumnIndex("列1");
    final int 列2 = ih.getColumnIndex("列2");
    try {
    for (Station s : busLines) {
    ih.prepareForInsert();
    ih.bind(列1, 对应的值);
    ih.bind(列2, 对应的值);
    ih.execute();
    }
    db.setTransactionSuccessful();
    } finally {
    ih.close();
    db.endTransaction();
    db.close();
    }

     

    第二种 :

      同样在 SQLiteDatabase 中 

    public void inertOrUpdateDateBatch(List<String> sqls) {
    SQLiteDatabase db = getWritableDatabase();
    db.beginTransaction();
    try {
    for (String sql : sqls) {
       db.execSQL(sql);
    }
    // 设置事务标志为成功,当结束事务时就会提交事务
    db.setTransactionSuccessful();
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    // 结束事务
    db.endTransaction();
    db.close();
    }
    }

    第三种:SQLiteDatabase  db.insert("table_name", null, contentValues) 中也可以批量插入

    public void insertData(插入数据){
    db.beginTransaction(); // 手动设置开始事务
    for (ContentValues v : list) {
    db.insert("表名", null, v);
    }
    db.setTransactionSuccessful(); // 设置事务处理成功,不设置会自动回滚不提交
    db.endTransaction(); // 处理完成
    db.close()
    }

       

    第四种 :  SQLiteStatement  个人比较喜欢用这种方式,对数据的处理看的很清楚明了

    String sql = "insert into表名(对应的列) values(?)";
    SQLiteStatement stat = db.compileStatement(sql);
    db.beginTransaction();
    for (数据集) {
      //循环所要插入的数据
    }
    db.setTransactionSuccessful();
    db.endTransaction();
    db.close();

    总结: 以上的几种方式都用到了数据库中的事务这个东西,sqlite语句在其中只会走一次,其他的就是数据循环到数据库中的对象里,这样比以前用对象插入,再用for在外围循环快的不知道多少倍,之前插入2000多条数据300多毫秒,以后对于上万条数据也是非常之快的。

     

  • 相关阅读:
    java中的 equals 与 ==
    String类的内存分配
    SVN用命令行更换本地副本IP地址
    npoi 设置单元格格式
    net core 微服务框架 Viper 调用链路追踪
    打不死的小强 .net core 微服务 快速开发框架 Viper 限流
    net core 微服务 快速开发框架 Viper 初体验20201017
    Anno 框架 增加缓存、限流策略、事件总线、支持 thrift grpc 作为底层传输
    net core 微服务 快速开发框架
    Viper 微服务框架 编写一个hello world 插件02
  • 原文地址:https://www.cnblogs.com/wangmars/p/3914090.html
Copyright © 2011-2022 走看看