情景:我现在要往sqlite database中的表中(R_USER_QUESTION_DO_HISTORY)插入十万条数据
1.我的代码:
public void setUpDataBaseForUser(String userID) {
String[] column = {
Config.COLUMN_USERID,
};
String selection = "UserID = '" + userID + "'";
Cursor cursor = database.query(Config.TABLE_R_USER_QUESTION_DO_HISTORY, column, selection, null, null, null, null);
if (cursor.getCount() == 0) {
//初始化表: R_User_Question_Do_History
int rowNum = getTotalRowInTable(Config.TABLE_R_USER_QUESTION_DO_HISTORY);
try {
ContentValues values = new ContentValues();
for (int i = 0; i < 100000; i++) {
values.put(Config.COLUMN_USERID, userID);
rowNum = ++rowNum;
values.put(Config.COLUMN_QUESTIONNUM, rowNum + "");
values.put(Config.COLUMN_ISCOLLECTED, 0);
values.put(Config.COLUMN_WRONGTIMES, 0);
values.put(Config.COLUMN_RIGHTTIMES, 0);
database.insert(Config.TABLE_R_USER_QUESTION_DO_HISTORY, null, values);
}
} catch (Exception e) {
throw e;
} finally {
cursor.close();
}
}
}
在activity中调用这个方法:
DBUtil dbUtil = new DBUtilConcreate();
dbUtil.initDataBase();
System.out.println("准备插入数据,当前时间:" + (new Date()));
dbUtil.setUpDataBaseForUser("A101");
System.out.println("数据插入结束,当前时间:"+(new Date()));
代码的确能完成100000条数据的插入,但是当把app运行起来的时候,却发现,这个功能却花费了5分钟都没有完成,你可以看到下
插入数据之前的时间是:11:32:01
数据插入成功的时候却是:11:37:13
试想一下,如果一个app为了完成这个功能花了5分钟都没有完成话,那么还会有谁会想用这个app?
2.接下来就是提高效率的时候了:
对原来的代码稍作修改:
public void setUpDataBaseForUser(String userID) {
String[] column = {
Config.COLUMN_USERID,
};
String selection = "UserID = '" + userID + "'";
Cursor cursor = database.query(Config.TABLE_R_USER_QUESTION_DO_HISTORY, column, selection, null, null, null, null);
if (cursor.getCount() == 0) {
//初始化表: R_User_Question_Do_History
int rowNum = getTotalRowInTable(Config.TABLE_R_USER_QUESTION_DO_HISTORY);
//加上的代码
database.beginTransaction();
try {
ContentValues values = new ContentValues();
for (int i = 0; i < 100000; i++) {
values.put(Config.COLUMN_USERID, userID);
rowNum = ++rowNum;
values.put(Config.COLUMN_QUESTIONNUM, rowNum + "");
values.put(Config.COLUMN_ISCOLLECTED, 0);
values.put(Config.COLUMN_WRONGTIMES, 0);
values.put(Config.COLUMN_RIGHTTIMES, 0);
database.insert(Config.TABLE_R_USER_QUESTION_DO_HISTORY, null, values);
}
//加上的代码
database.setTransactionSuccessful();
} catch (Exception e) {
throw e;
} finally {
cursor.close();
//加上的代码
database.endTransaction();
}
}
}
现在再运行一次,
你可以清清楚楚地看到,
插入数据之前的时间是:11:39:57
数据插入结束时间是:11:40:05
是的,加了三行代码之后,只花了8秒的时间,只用了原来的1/40左右。
这是为什么呢?
因为我们每一次insert操作,都涉及一次磁盘操作,10000次条数据就是10000次磁盘操作,我们的时间都浪费在了磁盘操作上。
我们把10000次地insert操作作为一个事物,来操作,减少磁盘操作次数,所用时间自然而然地就快了不少,那可是将近40倍地效率啊。
使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功,则所有从beginTransaction()开始的操作都会被提交,如果没有调用setTransactionSuccessful() 方法则回滚事务。
android中的事物使用方法:
database.beginTransaction();
try {
//这里写你的代码
database.setTransactionSuccessful();
} catch (Exception e) {
throw e;
} finally {
database.endTransaction();
}