使用execSQL进行批处理插入

今天学习了一下如何更加高效的执行对SQLite的插入操作

注:用的是真机测试

我们使用SQLiteDatabase的insert方法和execSQL分别进行试验

首先是insert方法:

public boolean insert(String table, ContentValues values) {    if (values == null || values.size() == 0) {           return false;       }       db = helper.getWritableDatabase();       long count = db.insert(table, null, values);       return count > 0; //count >0 就说明插入了数据   }

接下来是测试数据:

        UserDAO userDAO = new UserDAO(mContext);        ContentValues values = new ContentValues();        values.put(TbUserColumn.PASSWORD, "password");        long time1 = System.currentTimeMillis();        Log.i(TAG, "-------->>>非批处理插入操作开始执行:" + time1);        for (int i = 0; i < 1000; i++) {            values.put(TbUserColumn.USERNAME, "demo_user" + i);            userDAO.insert(TbUserColumn.TABLE_NAME, values);        }        long time2 = System.currentTimeMillis();        Log.i(TAG, "-------->>>非批处理插入操作执行完毕:" + time2);        Log.i(TAG, "-------->>>非批处理插入操作执行时间为:" + (time2 - time1));        List<Map<String, Object>> list = userDAO.query("SELECT * FROM tb_user", null);        Log.i(TAG, "-------->>>执行数据后的数量为:" + list.size());

下面就是执行的结果了:
数据库一开始是空的,如果获取的数据是1000条,说明我们就全部插入成功了

通过这张图片,可以知道,插入一千条数据,需要11.5秒,这太耗时间了。

接下来我们再用execSQL方法测试一下插入一千条数据需要多少时间
先将数据库文件删除,再进行测试。
首先是简单封装的方法

    public void execSQLByBatch(List<String> sqls) {        if (sqls == null || sqls.isEmpty()) {            return;        }        try {            db = helper.getWritableDatabase();            db.beginTransaction();            for (String sql : sqls) {                db.execSQL(sql);            }            db.setTransactionSuccessful();        } catch (Exception e) {            e.printStackTrace();        } finally {            db.endTransaction();        }    }

接下来是测试数据

        long startTime = System.currentTimeMillis();        Log.i(TAG, "-------->>>批处理插入操作开始组装数据");        List<String> sqls = new ArrayList<>();        for (int i = 0; i < 1000; i++) {            String sql = "INSERT INTO tb_user(userName,password) VALUES('" + i + "_user', 'password" + i + "')";            sqls.add(sql);        }        long entTime = System.currentTimeMillis();        Log.i(TAG, "-------->>>批处理操作组装数据完毕,所花时间为:" + (entTime - startTime));        startTime = System.currentTimeMillis();        Log.i(TAG, "-------->>>批处理操作开始执行:" + startTime);        userDAO.execSQLByBatch(sqls);        entTime = System.currentTimeMillis();        Log.i(TAG, "-------->>>批处理操作执行完毕:" + (entTime - startTime));        List<Map<String, Object>> list = userDAO.query("SELECT * FROM tb_user", null);        Log.i(TAG, "-------->>>获取数据的条数:" + list.size());

最后就是结果图了:

使用execSQL进行批量操作,插入一千条数据也就只用了0.5秒的时间,相较insert方法,速度快了有 23 倍了 所以在进行批处理操作的时候,不妨使用这个方法。

但是测试这个方法的时候,另外试了下,插入主键已存在的数据,那么会导致全部的数据都无法插入,是全部的数据。

可能是因为 db.setTransactionSuccessful();最后提交事务的时候,检查了是否插入有sql语句执行失败了,如果失败了,就不提交事务了。(猜测而已,找个时间在测试一下)

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. Android(安卓)与SQlite 数据库操作(新手步骤)
  4. Android之通过ContentProvider实现两个app(进程间)间通信以及函
  5. 数据更新后让ListView自动滚动到底部
  6. android 玩转ContentProvider之一--实现ContentProvider操作数据库
  7. Unity3d中MicroPhone的使用
  8. Android(安卓)OpenGL ES 绘图 -- 热力图
  9. Android(安卓)中自定义ContentProvider与ContentObserver的使用

随机推荐

  1. 在Android(安卓)Studio上搭建OpenCV 开发
  2. android手机震动的节奏例子--Vibrator对
  3. 在这个问题上,能看出 Android(安卓)工程师
  4. Android(安卓)短视频编辑开发之摄像头预
  5. Android检测模拟器
  6. Android仿QQ微信UI实现导航页和开场动画
  7. Android(安卓)源码分析实战 - 授权时拦截
  8. Android(安卓)APP必备高级功能,消息推送之
  9. android工程导入ADT缺default.properites
  10. Android(安卓)OpenGL ES(四)----调整屏幕