平常在做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. Gradle Goodness: Rename Ant Task Names When Importing Ant Build File

    Migrating from Ant to Gradle is very easy with the importBuild method from AntBuilder. We only have ...

  2. 多重背包问题II

    多重背包问题II 总体积是m,每个小物品的体积是A[i] ,每个小物品的数量是B[i],每个小物品的价值是C[i] 求能够放入背包内的最大物品能够获得的最大价值 和上一个很类似 上一题体积就是价值,这 ...

  3. UML元素分析

  4. http://www.cnblogs.com/AloneSword/p/3370462.html

    http://www.cnblogs.com/AloneSword/p/3370462.html

  5. MyBatis学习总结_12_Mybatis+Mysql分页查询

    package cn.tsjinrong.fastfile.util; /** * @ClassName: Page * @Description: TODO(分页组件的父类,用来封装分页的 通用内容 ...

  6. scala函数式编程

    1.作为值的函数 在Scala中,函数和数字一样,可以在变量中存放函数.可以把函数赋值给一个变量,格式为:val foee=fun _(函数名+空格+_)形式 2.匿名函数 在scala中,不需要给每 ...

  7. java Comparable和Comaprator的对比

    Comparable使一个class具备不同实例间进行比较的行为.这些对象的集合,可作为Collections.sort或Arrays.sort的参数 Comparator可以看成一种算法的实现,将算 ...

  8. oracle11g卸载出错 无法删除文件,文件正在使用中

    在卸载oracle11g时 停止服务后,运行C:\myoracle\think\product\11.2.0\dbhome_2\deinstall 中的 deinstall.bat 可以在cmd中直接 ...

  9. Form.ShowDialog和Form.DialogResult

    The dialog result of a form is the value that is returned from the form when it is displayed as a mo ...

  10. ERP调研之 对话

    开卷语: 2009年8月6号,A公司ERP项目顺利启动,按照项目进度的安排,项目组成员立即投入到紧张而又忙碌的的业务调研之中.这次为期3周的业务调研面向企业所有业务部门,包括产品部门.采购部门.计划部 ...