android sqlite插入效率(轉載)

對比在android中批量插入數據的3中方式對比(各插入1W條數據所花費的時間):
1、 一個一個插入

/**
* 向表中插入數據
*
* @param openHelper
* @param appInfo
* @return
*/
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)
方法

/**
* 向表中插入一串數據
*
* @param openHelper
* @param appInfo
* @return 如果成功則返回true,否則返回flase
*/
publicstaticboolean insert(SQLiteOpenHelper openHelper,
List 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

/**
* 第二種方式批量插入(插入1W條數據耗時:1365ms)
* @param openHelper
* @param list
* @return
*/
publicstaticboolean insertBySql(SQLiteOpenHelper openHelper,
List 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章