您的位置:首页 > 移动开发 > Android开发

Android Sqlite数据库执行插入查询更新删除的操作对比

2015-07-13 14:15 676 查看
转载:http://blog.csdn.net/ameyume/article/details/8276219

下面是在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等函数效率高。当数据库越大,差别也越大。

下面是验证代码:

[java] view
plaincopy

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;

}

}

执行效果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: