Android中,对SQLite的‘批处理’操作

使用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语句执行失败了,如果失败了,就不提交事务了。(猜测而已,找个时间在测试一下)

时间: 2024-10-01 12:57:41

Android中,对SQLite的‘批处理’操作的相关文章

Android中使用Sqlite数据库 (二) 增删改查

定义接口 package com.example.android_db.service; import java.util.List; import java.util.Map; public interface PersonService { public boolean addPerson(Object[] params); public boolean deletePerson(Object[] params); public boolean updatePerson(Object[] p

在Android中利用SQLite实现对数据的增删查改

停更了一天,I'm back again~~当我们需要操作大量的数据时,我们首先想到的当然是数据库,因为可以通过简单的语句实现数据的增删改查,在Android中,我们不使用SQL或者ORACLE,我们使用SQLite,因为它占用资源更少,而语句格式与SQL语句一样. 首先,我们来在Android中实现数据库的创建与增删改查,引用数据库的类时,不再继承常用的Activity类,而是继承Android中的SQLiteOpenHelper,创建一个构造方法,四个参数分别是(Context contex

详解Android中的SQLite数据库存储

前言 在Android中存储数据的方式有很多种,其中使用SQLite数据库是存储结构化数据的最佳选择.幸运的是,Android中默认提供了对SQLite的支持,这就使得在Android中使用SQLite数据库变得格外方便. 支持的数据类型 SQLite是一款轻量级的数据库,其支持的数据类型也很简单,主要有以下几种: text:字符类型 real:浮点类型 integer:整数类型 blob:二进制数据类型 创建数据库 SQLite数据库的使用始于SQLiteOpenHelper这个抽象类.我们需

Android中使用Sqlite数据库 (一) 建表

一.实现一个类,继承SQLiteOpenHelper类,并实现构造函数,onCreate()  onUpgrade() import android.content.Context; import android.database.DatabaseErrorHandler; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; impo

2014-08-01 ASP.NET中对SQLite数据库的操作——ADO.NET

今天是在吾索实习的第18天.我主要学习了如何在ASP.NET中对SQLite数据库的操作,其基本操作如下: 添加引用System.Data.SQLite.dll(PS:在网页里面任意找到适合的.NET Framework版本与位数所对应的压缩包,里面就会有该文件了). 在所在cs文件中加入using System.Data.SQLite; 定义两个string变量:ConStr.SqlStr,分别用于SQLite的连接字符串与SQL语句. 定义SQLiteConnection变量Conn,用于连

在android中使用SQLite数据库

SQLite数据库以其轻量.体积小等特点,使其在开发中运用的非常广泛,在前面的博客中我也介绍过在Cocos2d-x中使用SQLite数据库,这篇博客是介绍在Android中使用SQLite数据库,Android中直接集成了SQLite数据库,使用起来非常方便,不需要向Cocos2d-x中那样添加外部文件 我将使用SQLite数据库实现一个下图所示的效果,打开app后会弹出下图所示的界面 单击createDatabase按钮后,在logcat中可以看到打印了一条提示信息,表示数据库创建成功,当再次

Android中数据库Sqlite的性能优化

1.索引简单的说,索引就像书本的目录,目录可以快速找到所在页数,数据库中索引可以帮助快速找到数据,而不用全表扫描,合适的索引可以大大提高数据库查询的效率.(1). 优点大大加快了数据库检索的速度,包括对单表查询.连表查询.分组查询.排序查询.经常是一到两个数量级的性能提升,且随着数据数量级增长. (2). 缺点索引的创建和维护存在消耗,索引会占用物理空间,且随着数据量的增加而增加.在对数据库进行增删改时需要维护索引,所以会对增删改的性能存在影响. (3). 分类a. 直接创建索引和间接创建索引直

如何调试Android中的Sqlite数据

第一步:root你的手机,使用360手机助手的root工具最快: 第二步:在手机上安装RE文件管理器(英文全名root explorer,手机需授予root权限),然后根据这篇文章的内容将自己的app应用目录权限赋值为777 http://blog.csdn.net/libaineu2004/article/details/25247711 注意,你的app目录一般是/data/data/com.your.app.dir 第三步:在ADT中使用file explorer视图找到你的app目录,导

在Android中使用自带API操作Json

Json简介 JavaScript对象表示法(JavaScript Object Notation) 是存储和交换文本信息的语法 特点 是轻量级的文本数据交换格式 独立于语言和平台 具有自我描述性,更易理解 Json与XML 类似XML,比XML更小.更快.更易解析 没有结束标签 更短 读写的速度更快 使用数组 不使用保留字 Json语法 是JavaScript对象表示法语法的子集 数组在键值对中 数据由逗号分隔 大括号保存对象 中括号保存数组 Json值可以是 数字(整数或浮点数) 字符串(在