Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 830|回复: 0

android SQLite 批量插入数据慢的解决方案 (针对于不同的android api 版本)

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-15 17:55:35 | 显示全部楼层 |阅读模式

       

    原地址 :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多毫秒,以后对于上万条数据也是非常之快的。

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-23 04:47 , Processed in 0.064731 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表