Android開發過程中經常會用到數據庫,不可避免的會出現批量操作數據庫,比如一次操作需要往數據庫中插入一萬條記錄,這就需要進行批量操作,以下提供了四種批量操作方式,並分別進行對比。
- 直接使用SQL語句進行插入
- 直接使用SQL語句插入,添加事務
- 使用ContentValues方式
- 使用SQLiteStatement方式
接下來對每一種方式的實現及性能分別進行對比(向統一數據庫同一張表插入一萬條數據):
1.直接使用SQL語句進行插入
實現代碼爲:
@Override
public CommonResult addGroupMember()
{
String insertSQL = "insert into "
+ SQLHelp.GROUP_MEMBER_TABLENAME
+ "("
+ SQLHelp.GROUP_ID
+ ","
+ SQLHelp.MEMBERS_SUBS_ID
+ ","
+ SQLHelp.MEMBER_NICK_NAME
+ ","
+ SQLHelp.MEMBER_ROLE
+ ","
+ SQLHelp.MEMBER_JID
+ ","
+ SQLHelp.MEM_UNION_KEY
+ ","
+ SQLHelp.CREAT_TIME
+ ", "
+ SQLHelp.UPDATE_TIME
+ ","
+ SQLHelp.ORDER_ID
+ ","
+ SQLHelp.EXT
+ " ) values(458906628,85469875,'xinwei',2,100856,18663,'2015-06-08','2015-06-09',123456,'beizhu')";
SQLiteDatabase sqlDatabase = sqlHelp.getWritableDatabase();
// 插入一萬條
for (int i = 0; i < 10000; i++)
{
sqlDatabase.execSQL(insertSQL);
}
return null;
}
計時結果如下:
2.直接使用SQL語句插入,添加事務
這種方法是在第一種方法的基礎上,添加事務操作:
// 開始
sqlDatabase.beginTransaction();
// 設置爲成功
sqlDatabase.setTransactionSuccessful();
// 結束
sqlDatabase.endTransaction();
在操作數據庫之前設置爲開始、數據庫語句執行完畢後,設置數據庫事務爲Success,當執行到sqlDatabase.endTransaction()時,系統會判斷之前是否有設置成功標誌,如果沒有則認爲插入失敗,數據庫自動進行回滾操作。
執行代碼如下:
@Override
public CommonResult addGroupMemberThing()
{
String insertSQL = "insert into "
+ SQLHelp.GROUP_MEMBER_TABLENAME
+ "("
+ SQLHelp.GROUP_ID
+ ","
+ SQLHelp.MEMBERS_SUBS_ID
+ ","
+ SQLHelp.MEMBER_NICK_NAME
+ ","
+ SQLHelp.MEMBER_ROLE
+ ","
+ SQLHelp.MEMBER_JID
+ ","
+ SQLHelp.MEM_UNION_KEY
+ ","
+ SQLHelp.CREAT_TIME
+ ", "
+ SQLHelp.UPDATE_TIME
+ ","
+ SQLHelp.ORDER_ID
+ ","
+ SQLHelp.EXT
+ " ) values(458906628,85469875,'xinwei',2,100856,18663,'2015-06-08','2015-06-09',123456,'beizhu')";
SQLiteDatabase sqlDatabase = sqlHelp.getWritableDatabase();
// 開始
sqlDatabase.beginTransaction();
// 循環一萬次
for (int i = 0; i < 10000; i++)
{
// 執行語句
sqlDatabase.execSQL(insertSQL);
}
// 成功
sqlDatabase.setTransactionSuccessful();
// 結束
sqlDatabase.endTransaction();
return null;
}
執行結束後,結果如下:
3.使用ContentValues方式
使用ContentValues的好處是可以動態拼接SQL語句進行執行,有更好的靈活性,可以直接使用對象進行賦值,代碼如下:
@Override
public CommonResult addGroupMemberContentValues(CamTalkGroupMemberInfo memberInfo)
{
SQLiteDatabase sqlDatabase = sqlHelp.getWritableDatabase();
try
{
sqlDatabase.beginTransaction();
ContentValues values = new ContentValues();
if (memberInfo != null)
{
values.put(SQLHelp.GROUP_ID, memberInfo.getGroupID());
values.put(SQLHelp.MEMBERS_SUBS_ID, memberInfo.getMemberSubsID());
values.put(SQLHelp.MEMBER_NICK_NAME, memberInfo.getMemberNickName());
values.put(SQLHelp.MEMBER_ROLE, memberInfo.getMemberRole());
values.put(SQLHelp.MEMBER_JID, memberInfo.getMemberJID());
values.put(SQLHelp.MEM_UNION_KEY, memberInfo.getMemUnionKey());
values.put(SQLHelp.CREAT_TIME, convertDate2String(memberInfo.getCreatTime()));
values.put(SQLHelp.UPDATE_TIME, convertDate2String(memberInfo.getUpdateTime()));
values.put(SQLHelp.ORDER_ID, memberInfo.getOrderID());
values.put(SQLHelp.EXT, memberInfo.getExt());
// 插入10000次
for (int i = 0; i < 10000; i++)
{
sqlDatabase.insert(SQLHelp.GROUP_MEMBER_TABLENAME, null, values);
}
}
// 成功
sqlDatabase.setTransactionSuccessful();
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
// 結束
sqlDatabase.endTransaction();
sqlDatabase.close();
}
return null;
}
執行完畢後,結果如下:
4.使用SQLiteStatement方式
這個方法與上邊ContentValues方式實現大致類似,不同的是需要自己編寫SQL語句:
@Override
public CommonResult addGroupMemberStatement(CamTalkGroupMemberInfo memberInfo)
{
SQLiteDatabase sqlDatabase = null;
String insertSQL = "insert into " + SQLHelp.GROUP_MEMBER_TABLENAME + "(" + SQLHelp.GROUP_ID
+ "," + SQLHelp.MEMBERS_SUBS_ID + "," + SQLHelp.MEMBER_NICK_NAME + ","
+ SQLHelp.MEMBER_ROLE + "," + SQLHelp.MEMBER_JID + "," + SQLHelp.MEM_UNION_KEY
+ "," + SQLHelp.CREAT_TIME + ", " + SQLHelp.UPDATE_TIME + "," + SQLHelp.ORDER_ID
+ "," + SQLHelp.EXT + ") values " + "(?,?,?,?,?,?,?,?,?,?)";
try
{
sqlDatabase = sqlHelp.getWritableDatabase();
// SQL事物控制-結束之前檢測是否成功,沒有成功則自動回滾
sqlDatabase.beginTransaction();
SQLiteStatement stat = sqlDatabase.compileStatement(insertSQL);
stat.bindLong(1, memberInfo.getGroupID());
stat.bindString(2, memberInfo.getMemberSubsID());
stat.bindString(3, memberInfo.getMemberNickName());
stat.bindLong(4, memberInfo.getMemberRole());
stat.bindString(5, memberInfo.getMemberJID());
stat.bindString(6, memberInfo.getMemUnionKey());
stat.bindString(7, convertDate2String(memberInfo.getCreatTime()));
stat.bindString(8, convertDate2String(memberInfo.getUpdateTime()));
stat.bindString(9, memberInfo.getOrderID());
stat.bindString(10, memberInfo.getExt());
// 插入10000次
for (int i = 0; i < 10000; i++)
{
stat.executeInsert();
}
// 成功
sqlDatabase.setTransactionSuccessful();
}
catch (SQLException e)
{
e.printStackTrace();
}
finally
{
// 結束
sqlDatabase.endTransaction();
sqlDatabase.close();
}
return null;
}
執行結果如下:
5.總的對比圖
綜上,對比四種結果,使用SQLiteStatement 插入最快,插入一萬條數據,只需三秒鐘,性能最好。