Android批量插入数据到SQLite数据库

摘要:
在Android中,在sqlite中插入数据时,默认情况下一条语句是一个事务,因此如果有数以万计的数据插入,则需要执行数以万计的插入操作,操作速度可想而知。因此,在Android中插入数据时,批量插入可以大大提高插入速度。有时需要将一些数据嵌入到应用程序中。常见的方法有两种:一种是直接复制SQLite数据库文件,另一种是使用系统提供的数据库,然后批量插入数据。
Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知。因此在Android中插入数据时,使用批量插入的方式可以大大提高插入速度。
  有时需要把一些数据内置到应用中,常用的有以下2种方式:其一直接拷贝制作好的SQLite数据库文件,其二是使用系统提供的数据库,然后把数据批量插入。我更倾向于使用第二种方式:使用系统创建的数据库,然后批量插入数据。批量插入数据也有很多方法,那么那种方法更快呢,下面通过一个demo比较一下各个方法的插入速度。
 
1、使用db.execSQL(sql)
这里是把要插入的数据拼接成可执行的sql语句,然后调用db.execSQL(sql)方法执行插入。

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();
  }
}

 
2、使用db.insert("table_name", null, contentValues)
 这里是把要插入的数据封装到ContentValues类中,然后调用db.insert()方法执行插入。

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

 
3、使用InsertHelper类
这个类在API 17中已经被废弃了

InsertHelper ih = new InsertHelper(db, "userApps");
db.beginTransaction();
final int idColumnIndex = ih.getColumnIndex("id_");
final int nameColumnIndex = ih.getColumnIndex("name");
final int downloadTimesColumnIndex = ih.getColumnIndex("downloadTimes");
final int pkgNameColumnIndex = ih.getColumnIndex("pkgName");
try {
  for (XCSoftwareItem item : userappList) {
  ih.prepareForInsert();
  ih.bind(idColumnIndex, item.id);
  ih.bind(nameColumnIndex, item.name);
  ih.bind(downloadTimesColumnIndex, item.downloadTimes);
  ih.bind(pkgNameColumnIndex, sitempkgName);
  ih.execute();
}
  db.setTransactionSuccessful();
} finally {
  ih.close();
  db.endTransaction();
  db.close();
}

 
 
 
4、使用SQLiteStatement
查看InsertHelper时,官方文档提示改类已经废弃,请使用SQLiteStatement
 

String sql = "insert into userApps(id_,pkgName,name,downloadTimes) values(?,?,?,?)";
SQLiteStatement stat = db.compileStatement(sql);
db.beginTransaction();
for (XCSoftwareItem item : userAppsList) {
  stat.bindLong(1, item.id);
  stat.bindString(2, item.pkgName);
  stat.bindString(3, item.name);
  stat.bindLong(4, item.downloadTimes);
  stat.executeInsert();
}
db.setTransactionSuccessful();
db.endTransaction();
db.close();

 
 
测试下来第三种方法需要的时间最短,鉴于该类已经在API17中废弃,所以第四种方法应该是最优的方法
 

免责声明:文章转载自《Android批量插入数据到SQLite数据库》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Ubuntu安装apache+Yii2捕捉JDialog的关闭事件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

利用Python将excel数据读取到word表格

在工作中可能需要两者对excel和word进行转化,今天介绍例如Python 将excel转word表格 看图,我需要将这份excel文档转word表格: 思路: 1、创建需要的表格; 2、读取excel文档; 3、将excel文档数据写入word表格对应的位置; 4、循环 需要用到的模块 创建表格,由于我需要的表格需要进行合并处理,所以使用merge...

在CentOS 7上安装&amp;amp;配置PostgreSQL 12

一、前言 1、本文主要内容 PostgreSQL 12 安装(yum) PostgreSQL 12 基础配置 PostgreSQL 12 远程访问配置 PostgreSQL 基础管理 2、本文环境信息与适用范围 环境信息 软件 版本 CentOS 7.6 Release PostgreSQL 12.x 适用范围 软件 版本...

【Mybatis-Plus】使用updateById()、update()将字段更新为null或者空

问题背景: 最近测试同学给我提了个bug,字段不能置空,我查看了下项目配置发现是字段级别被设置为NOT_EMPTY导致的。 mybatis-plus FieldStrategy 有三种策略: 1.IGNORED:0 忽略 2.NOT_NULL:1 非 NULL,默认策略 3.NOT_EMPTY:2 非空 而默认更新策略是NOT_NULL:非 NULL;即通...

react + antd Table实现表格数据合并

效果如下 其实这种情况也可以使用树形数据表格展示,但是表格合并展示,看起来更直观.反正产品说哪种展示就哪种展示吧 我这里用到两种类型的后台数据,一种是一维数组数据,一种是有层级的二维数组. 表格合并最后要用到的数据都是一维数据,所以需要对数据处理一下.这两种处理方式对data数据从后台接口获取也一样适用 上代码,项目是react+typescr...

SqlServer关于“无法删除数据库 "XXXX",因为该数据库当前正在使用”问题的解决方案

引言 在项目中,通过使用SQL语句“DROP DATABASE [数据库名]”删除数据时,一直出现“无法删除数据库 "XXXX",因为该数据库当前正在使用”的错误信息,经测试在SqlSever数据库客户端中,直接执行该Sql语句可以正常执行,但是通过OLEDB执行该Sql语句,就出现上述错误,笔者查阅相关文档,找到了解决该问题的方法。 解决方法 将要删除的...

UNDO空间满的处理方法(含UNDO的学习与相关解释)

  1、查看数据库当前实例使用的是哪个UNDO表空间: show parameter undo_tablespace 2、查看UNDO表空间对应的数据文件和大小 set lines 200 pages 200col file_name for a60 col tablespace_name for a20;select tablespace_name,...