设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间14 现在时间14 缓存数据 她的声音可以讲故事,温柔中带着力量。

她的声音可以讲故事,温柔中带着力量。 -- 大眠

查看: 1425|回复: 1

Android批量插入数据到SQLite数据库的方法

[复制链接]

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
42
主题
36
精华
0
金钱
124
积分
78
注册时间
2023-9-29
最后登录
2025-5-31

发表于 2024-4-16 19:40:40 | 显示全部楼层 |阅读模式
Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知。因此在Android中插入数据时,使用批量插入的方式可以大大提高插入速度。

有时需要把一些数据内置到应用中,常用的有以下几种方式:

1、使用db.execSQL(sql)

这里是把要插入的数据拼接成可执行的sql语句,然后调用db.execSQL(sql)方法执行插入。
  1. public void inertOrUpdateDateBatch(List<String> sqls) {
  2. SQLiteDatabase db = getWritableDatabase();
  3. db.beginTransaction();
  4. try {
  5. for (String sql : sqls) {
  6. db.execSQL(sql);
  7. }
  8. // 设置事务标志为成功,当结束事务时就会提交事务
  9. db.setTransactionSuccessful();
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. } finally {
  13. // 结束事务
  14. db.endTransaction();
  15. db.close();
  16. }
  17. }
复制代码
2、使用db.insert("table_name", null, contentValues)

这里是把要插入的数据封装到ContentValues类中,然后调用db.insert()方法执行插入。
  1. db.beginTransaction(); // 手动设置开始事务
  2. for (ContentValues v : list) {
  3. db.insert("bus_line_station", null, v);
  4. }
  5. db.setTransactionSuccessful(); // 设置事务处理成功,不设置会自动回滚不提交
  6. db.endTransaction(); // 处理完成
  7. db.close()
复制代码
3、使用InsertHelper类

这个类在API 17中已经被废弃了
  1. InsertHelper ih = new InsertHelper(db, "bus_line_station");
  2. db.beginTransaction();
  3. final int directColumnIndex = ih.getColumnIndex("direct");
  4. final int lineNameColumnIndex = ih.getColumnIndex("line_name");
  5. final int snoColumnIndex = ih.getColumnIndex("sno");
  6. final int stationNameColumnIndex = ih.getColumnIndex("station_name");
  7. try {
  8. for (Station s : busLines) {
  9. ih.prepareForInsert();
  10. ih.bind(directColumnIndex, s.direct);
  11. ih.bind(lineNameColumnIndex, s.lineName);
  12. ih.bind(snoColumnIndex, s.sno);
  13. ih.bind(stationNameColumnIndex, s.stationName);
  14. ih.execute();
  15. }
  16. db.setTransactionSuccessful();
  17. } finally {
  18. ih.close();
  19. db.endTransaction();
  20. db.close();
  21. }
复制代码
4、使用SQLiteStatement

查看InsertHelper时,官方文档提示改类已经废弃,请使用SQLiteStatement
  1. String sql = "insert into bus_line_station(direct,line_name,sno,station_name) values(?,?,?,?)";
  2. SQLiteStatement stat = db.compileStatement(sql);
  3. db.beginTransaction();
  4. for (Station line : busLines) {
  5. stat.bindLong(1, line.direct);
  6. stat.bindString(2, line.lineName);
  7. stat.bindLong(3, line.sno);
  8. stat.bindString(4, line.stationName);
  9. stat.executeInsert();
  10. }
  11. db.setTransactionSuccessful();
  12. db.endTransaction();
  13. db.close();
复制代码
第三种方法需要的时间最短,鉴于该类已经在API17中废弃,所以第四种方法应该是最优的方法。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持晓枫资讯。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
-1
主题
2
精华
0
金钱
59
积分
22
注册时间
2022-12-24
最后登录
2023-6-17

发表于 2025-3-2 08:43:47 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

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