Android 编程下 SQLite 大数据量操作优化
来源:互联网 发布:java框架有几种 编辑:程序博客网 时间:2024/06/07 06:58
SQLite 因其小巧轻便被安卓系统广泛采用,当然在操作小数据量时,差异并不明显;但当 SQLite 在操作略大一点的数据时就显得力不存心了,这时的 CRUD 操作对移动存储设备的性能有着极大的要求,另外用户体验的良好性也对 SQLite 的性能优化提出了要求。那么,当我们在操作大数据量时如何对 SQLite 进行优化呢?正确的操作是:开启事务。下面我们通过采用不同的方式向数据库中插入 10000 条数据来进行比较以体现开启事务对 SQLite 性能提升方面所做出的贡献。首先看一张截图来进行一个感性的认识:
从上图中我们会很清晰的看到通过普通方式插入 10000 条数据和开启事务插入 10000 条数据之间的差异,整整差了 83 秒。下面我们来看测试代码:
package cn.sunzn.sqlitedatabase;
import android.app.Activity;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends Activity {
protected static final int SUCCESS_INSERT_TO_DB_ONE = 1;
protected static final int SUCCESS_INSERT_TO_DB_TWO = 2;
private EditText et_usedtime1;
private EditText et_usedtime2;
Handler handler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case SUCCESS_INSERT_TO_DB_ONE:
Integer usetime_one = (Integer) msg.obj;
et_usedtime1.setText("插入10000条数据耗时:" + usetime_one / 1000 + "秒");
break;
case SUCCESS_INSERT_TO_DB_TWO:
Integer usetime_two = (Integer) msg.obj;
et_usedtime2.setText("插入10000条数据耗时:" + usetime_two / 1000 + "秒");
break;
default:
break;
}
}
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_usedtime1 = (EditText) findViewById(R.id.et_usedtime1);
et_usedtime2 = (EditText) findViewById(R.id.et_usedtime2);
}
/**
* 1. 普通方式插入数据库 10000 条数据
*/
public void insert1(View view) {
MySQLiteOpenHelper openHelper = new MySQLiteOpenHelper(getApplicationContext());
final SQLiteDatabase database = openHelper.getWritableDatabase();
if (database.isOpen()) {
new Thread() {
public void run() {
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
ContentValues values = new ContentValues();
values.put("name", "tom:" + i);
database.insert("person", "_id", values);
}
database.close();
long end = System.currentTimeMillis();
int usetime_one = (int) (end - start);
Message message = new Message();
message.what = SUCCESS_INSERT_TO_DB_ONE;
message.obj = usetime_one;
handler.sendMessage(message);
};
}.start();
}
}
/**
* 2. 开启事务插入数据库 10000 条数据
*/
public void insert2(View view) {
MySQLiteOpenHelper openHelper = new MySQLiteOpenHelper(getApplicationContext());
final SQLiteDatabase database = openHelper.getWritableDatabase();
if (database.isOpen()) {
new Thread() {
public void run() {
long start = System.currentTimeMillis();
database.beginTransaction();
for (int i = 0; i < 10000; i++) {
ContentValues values = new ContentValues();
values.put("name", "tom:" + i);
database.insert("person", "_id", values);
}
database.setTransactionSuccessful();
database.endTransaction();
database.close();
long end = System.currentTimeMillis();
int usetime_two = (int) (end - start);
Message message = new Message();
message.what = SUCCESS_INSERT_TO_DB_TWO;
message.obj = usetime_two;
handler.sendMessage(message);
};
}.start();
}
}
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
为什么只是开启了一个事务就会有这么大的差距呢?很简单,SQLite 缺省为每个操作开启了一个事务,那么测试代码循环插入 10000 次开启了 10000 个事务,"事务开启 + SQL 执行 + 事务关闭" 自然耗费了大量的时间,这也是后面显式开启事务后为什么如此快的原因。
- Android 编程下 SQLite 大数据量操作优化(插入操作)
- Android 编程下 SQLite 大数据量操作优化
- Android 编程下 SQLite 大数据量操作优化
- Android 编程下 SQLite 大数据量操作优化
- Android 编程下 SQLite 大数据量操作优化
- Android 编程下 SQLite 大数据量操作优化
- Android 编程下 SQLite 大数据量操作优化
- mysql大数据量下的操作以及优化
- Sqlite大数据量查询优化比较-转
- 如何提高效率SQLITE 大数据量操作 效率
- 如何提高效率SQLITE 大数据量操作效率
- 如何提高效率SQLITE 大数据量操作效率
- 如何提高SQLITE大数据量操作效率
- 如何提高效率SQLITE 大数据量操作 效率
- Android编程下的SQLite优化
- 如何优化操作大数据量数据库
- springmvc 针对大数据量操作数据库 优化
- 大数据量下的数据操作
- getcwd的用法举例
- Tyvj P1034 尼克的任务 (DP)
- Android开源项目(五)
- NSInvocation的使用
- 打表
- Android 编程下 SQLite 大数据量操作优化
- [IE兼容性] Table 之边框
- 机场快线(Airport Express,UVA 11374)
- DI容器Ninject在管理接口和实现、基类和派生类并实现依赖注入方面的实例
- 项目产品化:添加友盟统计(Android和IOS)
- 迷你播放器--第一阶段(5)--添加搜索功能--autoCompleteBox的使用
- 数据库监控工具
- 视图的生命周期、以及每个方法中所做的工作。
- 关于出现WARNING: unable to write jarlist cache file ...\appcompat_v7\bin\jarlist.cache 问题详解