下面是在Android4.0上,利用Sqlite数据库的insert,query,update,delete函数以及execSql,rawQuery函数执行插入,查询,更新,删除操作花费时间的对比结果。
是在执行相同的动作,记录条数也一样的情况下的对比,多次验证的结果是:
(1)如果批量执行的记录数在1000条,则Android SqliteDatabase提供的insert,query,update,delete函数和直接写SQL文的execSql,rawQuery的效率差不多,几乎一样。所以使用哪种放到都可以,不会影响到执行效率。
(2)如果批量执行的记录数在10万条,则会存在差别。在某台手机上SqliteDatabase提供的insert执行插入操作耗时45秒,要比execSql插入35秒慢10秒左右。
可见在数据库大的情况下,还是有差别的。execSql省去了拼接sql语句的步骤,要比SqliteDatabase提供的insert,query,update,delete等函数效率高。当数据库越大,差别也越大。
下面是验证代码:
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private DBHelper mDbHelper = null;
private static TextView mTvInfo;
private static ProgressDialog mDialog = null;
private static Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
if(mDialog != null) {
mDialog.dismiss();
mDialog = null;
}
if (msg.what == 0) {
Bundle b = msg.getData();
int seconds = b.getInt("seconds");
int ms = b.getInt("ms");
StringBuilder builder = new StringBuilder("insert插入1000条记录花费时间:");
if (seconds > 0) {
builder.append(seconds).append("s ");
}
builder.append(ms).append("ms");
String strLines[] = mTvInfo.getText().toString().split("\n");
// 最多显示8条信息
for (int i = 0; i < strLines.length; i++) {
builder.append('\n').append(strLines[i]);
if (i == 6) {
break; // 加上原来最多7条信息,共显示8条信息
}
}
mTvInfo.setText(builder.toString());
} else if (msg.what == 1) {
Bundle b = msg.getData();
int seconds = b.getInt("seconds");
int ms = b.getInt("ms");
StringBuilder builder = new StringBuilder("execSql插入1000条记录花费时间:");
if (seconds > 0) {
builder.append(seconds).append("s ");
}
builder.append(ms).append("ms");
String strLines[] = mTvInfo.getText().toString().split("\n");
// 最多显示8条信息
for (int i = 0; i < strLines.length; i++) {
builder.append('\n').append(strLines[i]);
if (i == 6) {
break; // 加上原来最多7条信息,共显示8条信息
}
}
mTvInfo.setText(builder.toString());
} else if (msg.what == 10) {
Bundle b = msg.getData();
int count = b.getInt("count");
int seconds = b.getInt("seconds");
int ms = b.getInt("ms");
StringBuilder builder = new StringBuilder("query查询");
builder.append(count).append("条记录花费时间:");
if (seconds > 0) {
builder.append(seconds).append("s ");
}
builder.append(ms).append("ms");
String strLines[] = mTvInfo.getText().toString().split("\n");
// 最多显示8条信息
for (int i = 0; i < strLines.length; i++) {
builder.append('\n').append(strLines[i]);
if (i == 6) {
break; // 加上原来最多7条信息,共显示8条信息
}
}
mTvInfo.setText(builder.toString());
} else if (msg.what == 11) {
Bundle b = msg.getData();
int count = b.getInt("count");
int seconds = b.getInt("seconds");
int ms = b.getInt("ms");
StringBuilder builder = new StringBuilder("rawQuery查询");
builder.append(count).append("条记录花费时间:");
if (seconds > 0) {
builder.append(seconds).append("s ");
}
builder.append(ms).append("ms");
String strLines[] = mTvInfo.getText().toString().split("\n");
// 最多显示8条信息
for (int i = 0; i < strLines.length; i++) {
builder.append('\n').append(strLines[i]);
if (i == 6) {
break; // 加上原来最多7条信息,共显示8条信息
}
}
mTvInfo.setText(builder.toString());
} else if (msg.what == 20) {
Bundle b = msg.getData();
int count = b.getInt("count");
int seconds = b.getInt("seconds");
int ms = b.getInt("ms");
StringBuilder builder = new StringBuilder("update更新");
builder.append(count).append("条记录花费时间:");
if (seconds > 0) {
builder.append(seconds).append("s ");
}
builder.append(ms).append("ms");
String strLines[] = mTvInfo.getText().toString().split("\n");
// 最多显示8条信息
for (int i = 0; i < strLines.length; i++) {
builder.append('\n').append(strLines[i]);
if (i == 6) {
break; // 加上原来最多7条信息,共显示8条信息
}
}
mTvInfo.setText(builder.toString());
} else if (msg.what == 21) {
Bundle b = msg.getData();
int seconds = b.getInt("seconds");
int ms = b.getInt("ms");
StringBuilder builder = new StringBuilder("execSql更新1000条记录花费时间:");
if (seconds > 0) {
builder.append(seconds).append("s ");
}
builder.append(ms).append("ms");
String strLines[] = mTvInfo.getText().toString().split("\n");
// 最多显示8条信息
for (int i = 0; i < strLines.length; i++) {
builder.append('\n').append(strLines[i]);
if (i == 6) {
break; // 加上原来最多7条信息,共显示8条信息
}
}
mTvInfo.setText(builder.toString());
} else if (msg.what == 30) {
Bundle b = msg.getData();
int count = b.getInt("count");
int seconds = b.getInt("seconds");
int ms = b.getInt("ms");
StringBuilder builder = new StringBuilder("delete删除");
builder.append(count).append("条记录花费时间:");
if (seconds > 0) {
builder.append(seconds).append("s ");
}
builder.append(ms).append("ms");
String strLines[] = mTvInfo.getText().toString().split("\n");
// 最多显示8条信息
for (int i = 0; i < strLines.length; i++) {
builder.append('\n').append(strLines[i]);
if (i == 6) {
break; // 加上原来最多7条信息,共显示8条信息
}
}
mTvInfo.setText(builder.toString());
} else if (msg.what == 31) {
Bundle b = msg.getData();
int seconds = b.getInt("seconds");
int ms = b.getInt("ms");
StringBuilder builder = new StringBuilder("execSql删除1000条记录花费时间:");
if (seconds > 0) {
builder.append(seconds).append("s ");
}
builder.append(ms).append("ms");
String strLines[] = mTvInfo.getText().toString().split("\n");
// 最多显示8条信息
for (int i = 0; i < strLines.length; i++) {
builder.append('\n').append(strLines[i]);
if (i == 6) {
break; // 加上原来最多7条信息,共显示8条信息
}
}
mTvInfo.setText(builder.toString());
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnCreateDb = (Button)findViewById(R.id.btnCreateDb);
btnCreateDb.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
mDbHelper = new DBHelper(MainActivity.this, "test", null, 1);
}
});
// insert插入
Button btnInsert = (Button)findViewById(R.id.btnInsert);
btnInsert.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (mDbHelper != null) {
mDialog = ProgressDialog.show(MainActivity.this, "insert插入", "正在插入1000条记录,请稍等……", true);
new Thread() { // 开启线程执行防止阻塞
@Override
public void run() {
SQLiteDatabase db = mDbHelper.getWritableDatabase();
try {
// 利用事物批量插入数据以提高效率
ContentValues values = new ContentValues();
long startms = System.currentTimeMillis();
db.beginTransaction();
for (int i = 0; i < 1000; i++) {
values.put("name", new String("张三") + i);
values.put("birthday", "2012-12-08");
values.put("gender", i%2);
db.insert("student", null, values);
}
db.setTransactionSuccessful();
db.endTransaction();
long endms = System.currentTimeMillis();
int seconds = (int)((endms - startms)/1000);
int ms = (int)((endms - startms)%1000);
Message msg = new Message();
msg.what = 0;
// 使用bundle对象来传递数据
Bundle b = new Bundle();
if(seconds > 0) {
b.putInt("seconds", seconds);
}
b.putInt("ms", ms);
msg.setData(b);
mHandler.sendMessage(msg);
} catch(Exception e) {
e.printStackTrace();
} finally {
db.close(); // 关闭数据库
}
}
}.start();
} else {
Toast.makeText(MainActivity.this, "请先创建数据库!", Toast.LENGTH_SHORT).show();
}
}
});
// execSQL插入
Button btnExecSqlInsert = (Button)findViewById(R.id.btnExecSqlInsert);
btnExecSqlInsert.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (mDbHelper != null) {
mDialog = ProgressDialog.show(MainActivity.this, "execSQL插入", "正在插入1000条记录,请稍等……", true);
new Thread() { // 开启线程执行防止阻塞
@Override
public void run() {
SQLiteDatabase db = mDbHelper.getWritableDatabase();
try {
// 利用事物批量插入数据以提高效率
long startms = System.currentTimeMillis();
db.beginTransaction();
for (int i = 0; i < 1000; i++) {
db.execSQL("INSERT INTO student(name, birthday, gender) values(?, ?, ?)" ,
new Object[]{new String("李四" + i), "2012-12-08", i%2});
}
db.setTransactionSuccessful();
db.endTransaction();
long endms = System.currentTimeMillis();
int seconds = (int)((endms - startms)/1000);
int ms = (int)((endms - startms)%1000);
Message msg = new Message();
msg.what = 1;
// 使用bundle对象来传递数据
Bundle b = new Bundle();
if(seconds > 0) {
b.putInt("seconds", seconds);
}
b.putInt("ms", ms);
msg.setData(b);
mHandler.sendMessage(msg);
} catch(Exception e) {
e.printStackTrace();
} finally {
db.close(); // 关闭数据库
}
}
}.start();
}else {
Toast.makeText(MainActivity.this, "请先创建数据库!", Toast.LENGTH_SHORT).show();
}
}
});
// query查询
Button btnQuery = (Button)findViewById(R.id.btnQuery);
btnQuery.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (mDbHelper != null) {
mDialog = ProgressDialog.show(MainActivity.this, "query查询", "正在查询记录,请稍等……", true);
new Thread() { // 开启线程执行防止阻塞
@Override
public void run() {
SQLiteDatabase db = mDbHelper.getWritableDatabase();
try {
Log.d(TAG, "query Start:" + getDate());
long startms = System.currentTimeMillis();
// 查询所有记录
Cursor c = db.query("student", null, null, null, null, null, new String("id ASC LIMIT 0,1000"));
Log.d(TAG, "query End:" + getDate());
long endms = System.currentTimeMillis();
int seconds = (int)((endms - startms)/1000);
int ms = (int)((endms - startms)%1000);
if (c != null) {
Message msg = new Message();
msg.what = 10;
// 使用bundle对象来传递数据
Bundle b = new Bundle();
b.putInt("count", c.getCount());
if(seconds > 0) {
b.putInt("seconds", seconds);
}
b.putInt("ms", ms);
msg.setData(b);
mHandler.sendMessage(msg);
c.close();
}
} catch(Exception e) {
e.printStackTrace();
} finally {
db.close(); // 关闭数据库
}
}
}.start();
}else {
Toast.makeText(MainActivity.this, "请先创建数据库!", Toast.LENGTH_SHORT).show();
}
}
});
// rawQuery查询
Button btnRawQuery = (Button)findViewById(R.id.btnRawQuery);
btnRawQuery.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (mDbHelper != null) {
mDialog = ProgressDialog.show(MainActivity.this, "rawQuery查询", "正在查询记录,请稍等……", true);
new Thread() { // 开启线程执行防止阻塞
@Override
public void run() {
SQLiteDatabase db = mDbHelper.getWritableDatabase();
try {
Log.d(TAG, "rawQuery Start:" + getDate());
long startms = System.currentTimeMillis();
// 查询所有记录
Cursor c = db.rawQuery("SELECT * FROM student ORDER BY id ASC LIMIT 0,1000", null);
Log.d(TAG, "rawQuery End:" + getDate());
long endms = System.currentTimeMillis();
int seconds = (int)((endms - startms)/1000);
int ms = (int)((endms - startms)%1000);
if (c != null) {
Message msg = new Message();
msg.what = 11;
// 使用bundle对象来传递数据
Bundle b = new Bundle();
b.putInt("count", c.getCount());
if(seconds > 0) {
b.putInt("seconds", seconds);
}
b.putInt("ms", ms);
msg.setData(b);
mHandler.sendMessage(msg);
c.close();
}
} catch(Exception e) {
e.printStackTrace();
} finally {
db.close(); // 关闭数据库
}
}
}.start();
} else {
Toast.makeText(MainActivity.this, "请先创建数据库!", Toast.LENGTH_SHORT).show();
}
}
});
// update更新
Button btnUpdate = (Button)findViewById(R.id.btnUpdate);
btnUpdate.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (mDbHelper != null) {
mDialog = ProgressDialog.show(MainActivity.this, "update更新", "正在更新1000条记录,请稍等……", true);
new Thread() { // 开启线程执行防止阻塞
@Override
public void run() {
SQLiteDatabase db = mDbHelper.getWritableDatabase();
try {
ContentValues values = new ContentValues();
long startms = System.currentTimeMillis();
values.put("name", new String("王五"));
values.put("birthday", "2012-12-09");
values.put("gender", 0);
int count = db.update("student", values, new String("id IN (SELECT id FROM student ORDER BY id ASC LIMIT 0,1000)"), null);
long endms = System.currentTimeMillis();
int seconds = (int)((endms - startms)/1000);
int ms = (int)((endms - startms)%1000);
Message msg = new Message();
msg.what = 20;
// 使用bundle对象来传递数据
Bundle b = new Bundle();
b.putInt("count", count);
if(seconds > 0) {
b.putInt("seconds", seconds);
}
b.putInt("ms", ms);
msg.setData(b);
mHandler.sendMessage(msg);
} catch(Exception e) {
e.printStackTrace();
} finally {
db.close(); // 关闭数据库
}
}
}.start();
} else {
Toast.makeText(MainActivity.this, "请先创建数据库!", Toast.LENGTH_SHORT).show();
}
}
});
// execSQL更新
Button btnExecSqlUpdate = (Button)findViewById(R.id.btnExecSqlUpdate);
btnExecSqlUpdate.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (mDbHelper != null) {
mDialog = ProgressDialog.show(MainActivity.this, "execSQL更新", "正在更新1000条记录,请稍等……", true);
new Thread() { // 开启线程执行防止阻塞
@Override
public void run() {
SQLiteDatabase db = mDbHelper.getWritableDatabase();
try {
long startms = System.currentTimeMillis();
db.execSQL("UPDATE student SET name = ?, birthday = ?, gender = ? WHERE id IN (SELECT id FROM student ORDER BY id ASC LIMIT 0,1000)" ,
new Object[]{new String("马六"), "2012-12-10", 1});
long endms = System.currentTimeMillis();
int seconds = (int)((endms - startms)/1000);
int ms = (int)((endms - startms)%1000);
Message msg = new Message();
msg.what = 21;
// 使用bundle对象来传递数据
Bundle b = new Bundle();
if(seconds > 0) {
b.putInt("seconds", seconds);
}
b.putInt("ms", ms);
msg.setData(b);
mHandler.sendMessage(msg);
} catch(Exception e) {
e.printStackTrace();
} finally {
db.close(); // 关闭数据库
}
}
}.start();
}else {
Toast.makeText(MainActivity.this, "请先创建数据库!", Toast.LENGTH_SHORT).show();
}
}
});
// delete删除
Button btnDelete = (Button)findViewById(R.id.btnDelete);
btnDelete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (mDbHelper != null) {
mDialog = ProgressDialog.show(MainActivity.this, "delete删除", "正在删除1000条记录,请稍等……", true);
new Thread() { // 开启线程执行防止阻塞
@Override
public void run() {
SQLiteDatabase db = mDbHelper.getWritableDatabase();
try {
long startms = System.currentTimeMillis();
int count = db.delete("student", new String("id IN (SELECT id FROM student ORDER BY id ASC LIMIT 0,1000)"), null);
long endms = System.currentTimeMillis();
int seconds = (int)((endms - startms)/1000);
int ms = (int)((endms - startms)%1000);
Message msg = new Message();
msg.what = 30;
// 使用bundle对象来传递数据
Bundle b = new Bundle();
b.putInt("count", count);
if(seconds > 0) {
b.putInt("seconds", seconds);
}
b.putInt("ms", ms);
msg.setData(b);
mHandler.sendMessage(msg);
} catch(Exception e) {
e.printStackTrace();
} finally {
db.close(); // 关闭数据库
}
}
}.start();
} else {
Toast.makeText(MainActivity.this, "请先创建数据库!", Toast.LENGTH_SHORT).show();
}
}
});
// execSQL删除
Button btnExecSqlDelete = (Button)findViewById(R.id.btnExecSqlDelete);
btnExecSqlDelete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (mDbHelper != null) {
mDialog = ProgressDialog.show(MainActivity.this, "execSQL删除", "正在删除1000条记录,请稍等……", true);
new Thread() { // 开启线程执行防止阻塞
@Override
public void run() {
SQLiteDatabase db = mDbHelper.getWritableDatabase();
try {
long startms = System.currentTimeMillis();
db.execSQL("DELETE FROM student WHERE id IN (SELECT id FROM student ORDER BY id ASC LIMIT 0,1000)");
long endms = System.currentTimeMillis();
int seconds = (int)((endms - startms)/1000);
int ms = (int)((endms - startms)%1000);
Message msg = new Message();
msg.what = 31;
// 使用bundle对象来传递数据
Bundle b = new Bundle();
if(seconds > 0) {
b.putInt("seconds", seconds);
}
b.putInt("ms", ms);
msg.setData(b);
mHandler.sendMessage(msg);
} catch(Exception e) {
e.printStackTrace();
} finally {
db.close(); // 关闭数据库
}
}
}.start();
}else {
Toast.makeText(MainActivity.this, "请先创建数据库!", Toast.LENGTH_SHORT).show();
}
}
});
mTvInfo = (TextView)findViewById(R.id.tvInfo);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
/**
* 获取系统时间
* @return
*/
public static String getDate(){
Calendar ca = Calendar.getInstance();
int year = ca.get(Calendar.YEAR); // 获取年份
int month = ca.get(Calendar.MONTH); // 获取月份
int day = ca.get(Calendar.DATE); // 获取日
int minute = ca.get(Calendar.MINUTE); // 分
int hour = ca.get(Calendar.HOUR); // 小时
int second = ca.get(Calendar.SECOND); // 秒
int millisecond = ca.get(Calendar.MILLISECOND); // 毫秒
String date = year + "/" + (month + 1 )+ "/" + day + " "+ hour + ":" + minute + ":" + second + ":" + millisecond;
return date;
}
}
执行效果图: