Android 数据库 大量插入 事务开启

对比在android中批量插入数据的3中方式对比(各插入1W条数据所花费的时间):

1、 一个一个插入

 publicstaticboolean insert(SQLiteOpenHelper openHelper,
            RemoteAppInfo appInfo) {
        if (null == appInfo) {
            returntrue;
        }
        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();
            }
        }
        returnfalse;
    }  

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

耗时:106524ms,也就是106s

2、 开启事务批量插入,使用SqliteDateBase中的insert(String table, String nullColumnHack, ContentValues values)方法

publicstaticboolean insert(SQLiteOpenHelper openHelper,
        List<RemoteAppInfo> list) {
    boolean result = true;
    if (null == list || list.size() <= 0) {
        returntrue;
    }
    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();
        returnfalse;
    } finally {
        try {
            if (null != db) {
                db.endTransaction();
                db.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    returntrue;
}  

耗时:2968ms

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

  publicstaticboolean insertBySql(SQLiteOpenHelper openHelper,
            List<RemoteAppInfo> list) {
        if (null == openHelper || null == list || list.size() <= 0) {
            returnfalse;
        }
        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) {
                    returnfalse;
                }
            }
            db.setTransactionSuccessful();
        } catch (Exception e) {
            e.printStackTrace();
            returnfalse;
       } finally {
            try {
                if (null != db) {
                    db.endTransaction();
                    db.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        returntrue;
    }

耗时:1365ms

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-22 11:42:55

Android 数据库 大量插入 事务开启的相关文章

android数据库事务操作

在android应用程序开发中,在使用到数据库的时候,事务处理是非常重要的. 首先android数据库操作(特别是写操作)是非常慢的,将所有操作打包成一个事务能大大提高处理速度. 其次是保证数据的一致性,让一个事务中的所有操作都成功执行,或者失败,或者所有操作回滚. 标签:Android 事务 [1].[代码] [Java]代码 跳至 [1] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 mDatabase.beginTransaction(); try{   //在这里

C# access数据库软件使用事务插入多条记录

C# access数据库软件使用事务插入多条记录 protected void Button1_Click(object sender, EventArgs e) { /*=============测试通过===============*/ OleDbConnection con = new OleDbConnection(“Provider=Microsoft.Jet.OleDb.4.0;Da ta Source=C:/Inetpub/wwwroot/DotNetArticle/App_Dat

android菜鸟学习笔记20----Android数据存储(四))Android数据库操作

Android内置了一个名为SQLite的关系型数据库,这是一款轻量型的数据库,操作十分简便.SQLite与别的数据库不同的是,它没有数据类型.可以保存任何类型的数据到你所想要保存的任何表的任何列中.但它又支持常见的类型比如: NULL, VARCHAR, TEXT, INTEGER, BLOB, CLOB...等. 唯一的例外是:integer primary key 此字段只能存储64位整数. 在JAVA项目中,要使用JDBC操作数据库需要加载数据库驱动,连接数据库等操作.Android简化

数据库复习6——事务

数据库复习 CH13 事务 13.1 事务的概念 事务是作为单个逻辑工作单元执行的一系列数据库操作,这些操作可能会修改多个表中的多个元组 事务正常执行的结构是: begin; SQL execution 1 SQL execution 2 ... SQL execution N commit; begin标志开始一个事务,多个SQL语句就是事务逻辑工作单元,commit(提交)是结束当前事务并提交事务内数据变更,让其生效 数据库一致性在事务上表现的比较特殊,具体来说:事务执行的过程中可以让数据库

Android数据库之基本概念(上)

1.Android数据库简介 Android通过结合使用SQLite数据库和Content Provider,提供了结构化数据的持久功能. SQLite数据库可以通过一种结构化的.易于管理的方法来存储应用程序数据.Android提供了一个完整的SQLite关系数据库的库文件.每个应用程序都可以创建自己的数据库,并对这个数据库拥有完全的控制权. Android数据库存储在设备上的/data/data/<package name>/database文件夹中,所有的数据库都是私有的,只能被创建他们的

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

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

Android 数据库ORM框架GreenDao学习心得及使用总结&lt;一&gt;

Android 数据库ORM框架GreenDao学习心得及使用总结<一> 转: http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁的读写.查询等操作.因此首先想到了对整个项目的数据库框架进行优化. 原先使用android本身内置的sqllite,也就是用的最基本的SQLiteOpenHelper方法,这种方法对自己来说比较方便易懂.但是在使用过程中感觉很繁

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

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

Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())的注意点

以下内容可以作为面试官在面试的时候的问题,感觉比较好,是比较常用的知识点,可以用来考察基础是否扎实. 也可以程序猿学习.开发中的注意点.因为稍微不注意,就有可能导致数据库不能用. DBAdapter.java是一个简单的类,主要用来进行数据库操作. 1 package com.example.test_20131218; 2 3 import android.content.Context; 4 import android.database.sqlite.SQLiteDatabase; 5 6