Android批量插入数据效率对比

1、一个一个插入

/**
     * 向表中插入数据
     *
     * @param openHelper
     * @param appInfo
     * @return
     */
    public static boolean insert(SQLiteOpenHelper openHelper,
            RemoteAppInfo appInfo) {
        if (null == appInfo) {
            return true;
        }
        SQLiteDatabase db = null;
        try {
            db = openHelper.getWritableDatabase();
            ContentValues values = appInfo.getContentValues();
            return -1 != db.insert(RemoteDBHelper.TABLE_APP_REMOTE, null,
                    values);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != db) {
                db.close();
            }
        }
        return false;
    }

    for (RemoteAppInfo remoteAppInfo : list) {
                    RemoteDBUtil.insert(helper, remoteAppInfo);
                }

耗时:106524ms,也就是106s

2、 开启事务批量插入,使用

SqliteDateBase中的

insert(String table, String nullColumnHack, ContentValues values)

方法

/**
 * 向表中插入一串数据
 *
 * @param openHelper
 * @param appInfo
 * @return 如果成功则返回true,否则返回flase
 */
public static boolean insert(SQLiteOpenHelper openHelper,
        List<RemoteAppInfo> list) {
    boolean result = true;
    if (null == list || list.size() <= 0) {
        return true;
    }
    SQLiteDatabase db = null;

    try {
        db = openHelper.getWritableDatabase();
        db.beginTransaction();
        for (RemoteAppInfo remoteAppInfo : list) {
            ContentValues values = remoteAppInfo.getContentValues();
            if (db.insert(RemoteDBHelper.TABLE_APP_REMOTE, null, values) < 0) {
                result = false;
                break;
            }
        }
        if (result) {
            db.setTransactionSuccessful();
        }
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    } finally {
        try {
            if (null != db) {
                db.endTransaction();
                db.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return true;
}

耗时:2968ms

3、 开启事务批量插入,使用

SQLiteStatement

/**
     * 第二种方式批量插入(插入1W条数据耗时:1365ms)
     * @param openHelper
     * @param list
     * @return
     */
    public static boolean insertBySql(SQLiteOpenHelper openHelper,
            List<RemoteAppInfo> list) {
        if (null == openHelper || null == list || list.size() <= 0) {
            return false;
        }
        SQLiteDatabase db = null;
        try {
            db = openHelper.getWritableDatabase();
            String sql = "insert into " + RemoteDBHelper.TABLE_APP_REMOTE + "("
                    + RemoteDBHelper.COL_PKG_NAME + ","// 包名
                    + RemoteDBHelper.COL_USER_ACCOUNT + ","// 账号
                    + RemoteDBHelper.COL_APP_SOURCE + ","// 来源
                    + RemoteDBHelper.COL_SOURCE_UNIQUE + ","// PC mac 地址
                    + RemoteDBHelper.COL_MOBILE_UNIQUE + ","// 手机唯一标识
                    + RemoteDBHelper.COL_IMEI + ","// 手机IMEI
                    + RemoteDBHelper.COL_INSTALL_STATUS + ","// 安装状态
                    + RemoteDBHelper.COL_TRANSFER_RESULT + ","// 传输状态
                    + RemoteDBHelper.COL_REMOTE_RECORD_ID // 唯一标识
                    + ") " + "values(?,?,?,?,?,?,?,?,?)";
            SQLiteStatement stat = db.compileStatement(sql);
            db.beginTransaction();
            for (RemoteAppInfo remoteAppInfo : list) {
                stat.bindString(1, remoteAppInfo.getPkgName());
                stat.bindString(2, remoteAppInfo.getAccount());
                stat.bindLong(3, remoteAppInfo.getFrom());
                stat.bindString(4, remoteAppInfo.getFromDeviceMd5());
                stat.bindString(5, remoteAppInfo.getMoblieMd5());
                stat.bindString(6, remoteAppInfo.getImei());
                stat.bindLong(7, remoteAppInfo.getInstallStatus());
                stat.bindLong(8, remoteAppInfo.getTransferResult());
                stat.bindString(9, remoteAppInfo.getRecordId());
                long result = stat.executeInsert();
                if (result < 0) {
                    return false;
                }
            }
            db.setTransactionSuccessful();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                if (null != db) {
                    db.endTransaction();
                    db.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return true;
    }

耗时:1365ms

时间: 2024-08-06 15:42:43

Android批量插入数据效率对比的相关文章

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

Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知.因此在Android中插入数据时,使用批量插入的方式可以大大提高插入速度. 有时需要把一些数据内置到应用中,常用的有以下2种方式:其一直接拷贝制作好的SQLite数据库文件,其二是使用系统提供的数据库,然后把数据批量插入.我更倾向于使用第二种方式:使用系统创建的数据库,然后批量插入数据.批量插入数据也有很多方法,那么那种方法更快呢,下面通过一个dem

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

Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知.因此在Android中插入数据时,使用批量插入的方式可以大大提高插入速度. 有时需要把一些数据内置到应用中,常用的有以下2种方式:其一直接拷贝制作好的SQLite数据库文件,其二是使用系统提供的数据库,然后把数据批量插入.我更倾向于使用第二种方式:使用系统创建的数据库,然后批量插入数据.批量插入数据也有很多方法,那么那种方法更快呢,下面通过一个dem

Oracle 逐条和批量插入数据方式对比

创建测试表 create table base_users ( userid         varchar2(16), username  varchar2(32), passwd      varchar2(16) )tablespace cat_data; 采用一条一条插入的方式 create or replace procedure insert_data_one_by_one(n in number) as currentId number(16) := 0; l_userid var

Oracle 插入数据效率对比

oracle插入数据有多种方式: 将从多个表中查出来的数据插入到临时表中 数据行数 5189597 1.传统方式:直接将数据插入到表中 1 insert into LLB_BASIC_USER_D_TEMP_TEST 2 select t.serv_id, 3 t.phone_id, 4 a1.loc_imei t, 5 region_code, 6 t.county_code, 7 t.payment_mode_cd, 8 t.plan_id, 9 t.productflux, 10 t.al

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

SQLite,是一款轻型的数据库,被广泛的运用到很多嵌入式的产品中,因为占用的资源非常少,二其中的操作方式几乎和我们接触的数据库不多,甚至只有几百K的他自然会被需求者青睐,下面讲一下在这样的轻型数据库中怎么对他进行一些读写操作. 之前做选择联系人的时候出现如果一个手机里联系人超过2000的话,往数据库里面插入会非常耗时,不同的手机存储的条数不同,这个存储的数量和手机的内存有很大的关系,往往取决于手机内存,下面对于数据量大的情况来写一下sqlite的批量查询. SqLite 掺入数据有几种 第一种

批量插入数据(基于Mybatis的实现-Oracle)

前言:做一个数据同步项目,要求:同步数据不丢失的情况下,提高插入性能. 项目DB框架:Mybatis.DataBase:Oracle. ---------------------------------------------------------------------------- 批量插入数据方式: 一.Mybatis 全局设置批处理: 二.Mybatis 局部设置批处理: 三.Mybatis foreach批量插入: ①SELECT UNION ALL: ②BEGIN INSERT I

SQL Server 批量插入数据的两种方法

在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量数据插入方法:Bulk和表值参数(Table-Valued Parameters). 运行下面的脚本,建立测试数据库和表值参数. [c-sharp] view plaincopy --Create DataBase create database BulkTestDB; go use BulkTes

有关批量插入数据的问题

使用c#批量插入数据时,通过for循环,每次执行一条SQL语句进行数据插入,会使插入操作效率非常低下. 提高效率的方法: 1.SqlBulkCopy类. 2.表值参数. 在SqlServer存储过程中还可以 3.将For循环Insert部分放入一个Transaction中. 具体论证与实现,改日追加. 有关批量插入数据的问题,布布扣,bubuko.com

将list&lt;对象&gt;转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据

领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其他的方法,不过这个方法已经实现,就写一下了: 1.创建表. CREATE TABLE [dbo].[person]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NULL, [Pwd] [nvarchar](50) NULL, [Age]