平常在做Android数据库操作时,都是用的execSQL之个方法. 今天偶然发现了SQLiteStatement这个类.让我想起了在做Java Web开发写JDBC的代码时Prestatement这个类.Prestatement不仅提高了效率,也解决了SQL注入的问题.那在Android中的SQLiteStatement,是否也会提高一些效率呢?

于是写了一个简单的测试,比较execSQL和SQLiteStatement的executeInsert方法插入1000条数据所需要的时间.都没有使用事物.

新建一个数据库和users表:

public class DBHelper extends SQLiteOpenHelper {

    private static final String DB_NAME = "userdb";
private static final int DB_VERSION = 1; public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
} @Override
public void onCreate(SQLiteDatabase db) {
StringBuffer sql = new StringBuffer();
sql.append("create table users");
sql.append("(_id int PRIMARY KEY,name varchar,gender int,age int,phoneNumber varchar,address varchar)"); db.execSQL(sql.toString());
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }

然后分别使用SQLiteDatabase 的execSQL方法和SQLiteStatement的executeInsert方法进入插入, 比较执行所需要的时间:

public class UserDao {

    private DBHelper dbHelper;
private SQLiteDatabase db; private StringBuffer sql_insert;
private List<User> users; public UserDao(Context context){
this.dbHelper = new DBHelper(context);
this.db = dbHelper.getWritableDatabase(); sql_insert = new StringBuffer();
sql_insert.append("INSERT INTO users(name,gender,age,phoneNumber,address) ");
sql_insert.append(" VALUES( ?, ?, ?, ?, ?)"); users = new ArrayList<User>(); //测试数据
for(int i = 0;i<1000;i++){
User user = new User();
user.setId(i);
user.setName("name"+i);
user.setGender(0);
user.setAge(user.getRandomAge());
user.setPhoneNumber("13800138000");
user.setAddress("GuangDong ShenZhen No."+i); users.add(user);
} } /**
* 使用SQLiteDatabase 的execSQL方法插入数据
* @return 返回执行所需要的时间
*/
public long insertexecSQL()
{ long start=System.currentTimeMillis();
for(User user:users){
Object[] bindArgs = {user.getName(),user.getGender(),user.getAge(),user.getPhoneNumber(),user.getAddress()};
db.execSQL(sql_insert.toString(),bindArgs);
}
long end = System.currentTimeMillis(); return end - start;
} /**
* 使用SQLiteStatement的executeInsert方法插入数据
* @return 返回执行所需要的时间
*/
public long insertStatement()
{
long start = System.currentTimeMillis();
for(User user:users){
SQLiteStatement statement= db.compileStatement(sql_insert.toString());
statement.bindString(1, user.getName());
statement.bindLong(2, user.getGender());
statement.bindLong(3, user.getAge());
statement.bindString(4, user.getPhoneNumber());
statement.bindString(5, user.getAddress());
statement.executeInsert();
}
long end = System.currentTimeMillis();
return end - start;
}
}

界面方面就两个按钮,分别调用不同的插入方法, 并将执行所需的时间显示在Button上.

public class MainActivity extends Activity {

    private Button btn1;
private Button btn2; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); final UserDao dao = new UserDao(this); btn1 = (Button) findViewById(R.id.btn1);
btn2 = (Button) findViewById(R.id.btn2); btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
btn1.setText(String.valueOf(dao.insertexecSQL()));
}
}); btn2.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
btn2.setText(String.valueOf(dao.insertStatement()));
}
}); } }

通过几次比较发现,插入1000条数据,使用SQLiteStatement的executeInsert方法一般比使用SQLiteDatabase 的execSQL方法快5秒左右.这个差距还是很大的.

需要说明的是,上面的两个方法我们都没有开启事物.在进行这样的批量操作时,开启事物肯定会很大程度上提高效率.

db.beginTransaction();
xxxx….
db.setTransactionSuccessful();
db.endTransaction();

还有一个需要注意的问题是,在批量插入1000条数据的时候,并没用使用异步类或新的线程.我发现界面明显会出现停顿的现象.如果插入更大数量的数据时,会直接停止响应.

所以,在进行数据操作的时候, 如果数据量较大, 建议使用异步类或开启新的线程.

本文转自:http://liuzhichao.com/p/1664.html

Android应用性能优化之使用SQLiteStatement优化SQLite操作的更多相关文章

  1. Android应用性能优化(转)

    人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然连贯(帧率为24fps),用手机当然也需要感知屏幕操作的连贯性(尤其是动画过度),所以Android索性就把达到这 ...

  2. Android客户端性能优化(魅族资深工程师毫无保留奉献)

    本文由魅族科技有限公司资深Android开发工程师degao(嵌入式企鹅圈原创团队成员)撰写,是degao在嵌入式企鹅圈发表的第一篇原创文章,毫无保留地总结分享其在领导魅族多个项目开发中的Androi ...

  3. 十大技巧优化Android App性能

    无论锤子还是茄子手机的不断冒出,Android系统的手机市场占有率目前来说还是最大的,因此基于Android开发的App数量也是很庞大的. 那么,如何能开发出更高性能的Android App?相信是软 ...

  4. 优化Android App性能?十大技巧必知!

    无论锤子还是茄子手机的不断冒出,Android系统的手机市场占有率目前来说还是最大的,因此基于Android开发的App数量也是很庞大的.那么,如何能开发出更高性能的Android App?相信是软件 ...

  5. Android 性能优化——之图片的优化

    Android 性能优化——之图片的优化 在Android性能优化中,我们会发现占内存最大的和对性能影响最大的往往是图片资源,其次是控件资源.相对来说,其他的资源的影响会小一点.这里我就先对图片资源的 ...

  6. Android APP 性能优化的一些思考

    说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...

  7. Android性能优化之被忽视的优化点

    对于性能优化这个知识点来说,实在是太广了,博主本人也一直非常关注这方面的学习,而对于性能优化来说它包括了非常非常非常多方面,比如:I/O的优化.网络操作的优化.内存的优化.数据结构的优化.代码层次的优 ...

  8. Android艺术——性能优化问题

    这次分析方向,我们主要包括:布局优化.绘制优化.内存泄漏优化.响应速度优化.ListView优化.Bitmap优化.线程优化. 布局优化:尽量的减少布局的层级,这意味着Android绘制时的工作量会变 ...

  9. Android 性能优化:使用 Lint 优化代码、去除多余资源

    前言 在保证代码没有功能问题,完成业务开发之余,有追求的程序员还要追求代码的规范.可维护性. 今天,以“成为优秀的程序员”为目标的拭心将和大家一起精益求精,学习使用 Lint 优化我们的代码. 什么是 ...

随机推荐

  1. C#DataGrdviewl加入checkBox全选删除

    #region 加入checkBox /// <summary> /// 加入checkBox /// </summary> /// <param name=" ...

  2. 最简单的jdbc程序

    package cn.ytu.mybatis.jdbc;   import java.sql.Connection; import java.sql.DriverManager; import jav ...

  3. VS2010/MFC编程入门之五(MFC消息映射机制概述)

    VS2010/MFC编程入门之五(MFC消息映射机制概述)-软件开发-鸡啄米 http://www.jizhuomi.com/software/147.html 上一讲鸡啄米为大家简单分析了MFC应用 ...

  4. k序数组排序

    这道题,已知一个数组a,a[i]排好序后位于a[i-k]跟a[i+k]之间,问说该怎么最快地排序. 可以转换成多路归并问题, a[0]<a[k+1]<a[2k+2]<a[3k+3]. ...

  5. 唯一区别是不会去取emptyText 的值,没有选选择选项的时候返回是空字符串

    combox取值以及赋值的方法 function getValue() { //注意:以下这两种取值方法都会存在一个问题: 当combox设置成能输入并有只能提示的时候,当输入的不是备选项时,或到的v ...

  6. weka数据挖掘拾遗(三)----再谈如果何生成arff

    前一阵子写过一个arff的随笔,但是写完后发现有些啰嗦.其实如果使用weka自带的api,生成arff文件将变成一件很简单的事儿. 首先,可以先把特征文件生成csv格式的.csv格式就是每列数据都用逗 ...

  7. linux select

    man select: #include <sys/select.h> #include <sys/time.h> int select(int nfds, fd_set *r ...

  8. USACO Section 3.3: Home on the Range

    到最后发现是DP题 /* ID: yingzho1 LANG: C++ TASK: range */ #include <iostream> #include <fstream> ...

  9. ubuntu下如何查看用户登录及系统授权相关信息【转】

    转自:http://www.tuicool.com/articles/ia67Bj 如何在ubuntu下查看相关用户登录历史,进行系统的日志跟踪和分析,以便发现系统登录问题,进行安全策略防护呢?ubu ...

  10. 【转】Android Gson的使用

    Android Gson 2014 年 05 月 22 日 android 目前的客户端大都有和服务端进行交互,而数据的格式基本就是json了,于是在Android开发中就经常用到json解析,方便的 ...