日期:2014-05-16  浏览次数:20420 次

android数据库操作优化(二)

        在android中查询sqlite数据库,我们一般都是写一个继承SQLiteOpenHelper的工具类,然后实例化SQLiteDatabase对象去进行各种增删改查的操作,对于查询出来的结果,我们一般都放在google封装好的Cursor(游标)中,然后从Cursor中取出我们查询语句的value结果,过程类似这样:

public int getId(String name) {
                int id = 0;
                SQLiteDatabase db = getReadableDatabase();
                if (db.isOpen() && !db.isDbLockedByOtherThreads()) {
                        String sql = "SELECT id from cursor where name = '" + name + "'";
                        Cursor cursor = db.rawQuery(sql, null);
                        while (cursor.moveToNext()) {
                                id = cursor.getInt(cursor.getColumnIndex("id"));
                        }
                        if (cursor != null) {
                                cursor.close();
                        }
                }
                if (db != null) {
                        db.close();
                }
                return id;
        }
当我们想求得某一列所有数据之和时,我们一般采用这种方法:

public int getSum(){
                int sum = 0;
                SQLiteDatabase db = getReadableDatabase();
                if(db.isOpen() && !db.isDbLockedByOtherThreads()){
                        String sql = "SELECT id FROM people";
                        Cursor cursor = db.rawQuery(sql, null);
                        while(cursor.moveToNext()){
                                sum += cursor.getInt(cursor.getColumnIndex("id"));
                        }
                        if(cursor != null){
                                cursor.close();
                        }
                }
                if(db != null){
                        db.close();
                }
                return sum;
        }
通过遍历的方法将Cursor中求出的每一列的值都相加,然后取得最后结果,但这种方法的弊端就是效率,遍历这么多次耗费了太多了时间和资源。
优化的方法是这样的:
public int getSum(){
                int sum =0;
                SQLiteDatabase db = getReadableDatabase();
                if(db.isOpen() && !db.isDbLockedByOtherThreads()){
                        String sql = "SELECT SUM(id) AS sum from people";
                        Cursor cursor = db.rawQuery(sql, null);
                        while(cursor.moveToNext()){
                                sum = cursor.getInt(cursor.getColumnIndex("sum"));
                        }
                        if(cursor != null){
                                cursor.close();
                        }
                }
                if(db != null){
                        db.close();
                }
                 
                return sum;
        }
直接用sql语句在数据查询的时候返回这一列所有值之和,由于是在数据库查询的时候就获得了一个结果,不需要在代码中进行遍历,效果当然是杠杠的!!

下图是单元测试的结果,我预先向数据库插入了近1000条数据:



<