当前位置:操作系统 > 安卓/Android >>

android数据库操作优化(二)

 在android中查询sqlite数据库,我们一般都是写一个继承SQLiteOpenHelper的工具类,然后实例化SQLiteDatabase对象去进行各种增删改查的操作,对于查询出来的结果,我们一般都放在google封装好的Cursor(游标)中,然后从Cursor中取出我们查询语句的value结果,过程类似这样:
[java] 
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;  
        }  
当我们想求得某一列所有数据之和时,我们一般采用这种方法:
[java]  
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中求出的每一列的值都相加,然后取得最后结果,但这种方法的弊端就是效率,遍历这么多次耗费了太多了时间和资源。
优化的方法是这样的:
[java]  
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条数据:
 
 
Test1是SELECT id FROM people的结果,Test2是SELECT SUM(id) AS sum from people的结果,text中“----”前面是id的和,后面是执行程序所用的时间,Test1为110毫秒,而Test2为15毫秒!
 
        由于实际需要,我们常常从sqlite数据库中获取int类型,但实际使用的时候我们需要转换数据类型为String类型,其实我们可以在从数据库获取数据的时候直接转换成String类型或者其他类型,例如:
[java] 
int sum = cursor.getInt(cursor.getColumnIndex("sum"));  
我们可以直接写成:
[java] 
String sum = cursor.getString(cursor.getColumnIndex("sum"));  
这样就直接获取到了String类型数据了,不需要考虑数据库表数据类型和代码类型转换。
 
        我们在获得数据库返回数据的时候,通常这样写:while(cursor.moveToNext()){};来遍历获取cursor中的数据,这是因为cursor其实是一行一行获取数据库中的数据的,while循环中的sum = cursor.getInt(cursor.getColumnIndex("sum"))中的cursor.getColumnIndex(&q
补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,