2 zhengdanimu zhengdanimu 于 2013.01.24 13:35 提问

在android中从sqlite中获得数据很慢

我的代码是:

DatabaseHandler db = new DatabaseHandler(this);
System.out.println("Start - " + System.currentTimeMillis());
for (int i = 1; i < db.getChampsCount() + 1; i++) {
    String name = db.getChampInfo(i, "name");
    String title = db.getChampInfo(i, "title");
    String thumb = db.getChampInfo(i, "thumb");
    System.out.println("End - " + System.currentTimeMillis());
    [...]
}

和这个

String getChampInfo(int id, String col) {
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.rawQuery("SELECT " + col + " FROM champions WHERE id = " + id, new String[] {});
    if (cursor != null)
        cursor.moveToFirst();

    db.close();
    return cursor.getString(0);
}

这是DatabaseHelper类的一部分

这个运行没有问题,但是问题是它执行起来时间很长(在我的android机子上是2089ms)。这些字符串是UI的一部分,所以我不认为我能把他放到另外一个线程中。如果要让这段代码跑的快一点,我应该怎么做?

确切的说是110行

2个回答

Sueyexin
Sueyexin   2013.01.29 14:52
已采纳

不应该是用单独的语句,你不应该用单独的sql语句?

只是创建一个ArrayList,在这个activity类中存储所有需要的数值。
例如: ArrayList myData;

现在在数据库类的帮助下写一个function,就像下边:
//得到你想要的数据

public ArrayList<String> getAllData() {          
    ArrayList<String> subTitleList = null;         
    Cursor cursor = null;          
    try {              
    String queryString = "SELECT * FROM champions";              
        cursor =  db.rawQuery(queryString, null);              
        if (cursor != null && cursor.moveToFirst()) {                 
            subTitleList = new ArrayList<String>();                 
            do {                     
                String nextUser = new String(cursor.getString(cursor.getColumnIndex("name")));                     
                String nextUser = new String(cursor.getString(cursor.getColumnIndex("title")));                     
                String nextUser = new String(cursor.getString(cursor.getColumnIndex("thumb")));                     

                subTitleList.add(nextUser);                 
            } 
            while (cursor.moveToNext());   
            System.out.println("it comes in SubTitleList");
        }         
    } 
    catch (Exception e) {             
        e.printStackTrace();             
        subTitleList = null;         
    } 
    finally {             
        if (cursor != null && !cursor.isClosed()) {                 
            cursor.deactivate();                 
            cursor.close();                 
            cursor = null;             
        }             
        if(db != null){                 
            db.close();             
        }         
    }
    //System.out.println("SubTitleList is: "+subTitleList);
    return subTitleList;   
}

现在在你的activity类中你可以调用这个方法,然后从myData ArrayList获得所有你需要的数据。

myData = db.getAllData(); // 我想如果你想要抓所有的数据的话是不需要ID的。

希望你能明白

cytown
cytown   2013.01.24 15:06

getChampInfo本身运行就有错,哪有先close db再取cursor的。

而且如果这样返回所有值的方法,都是使用cursor打开一次,然后返回一个对象列表或者什么的。

难道从来没写过数据库?

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Android数据读取之Sqlite数据库操作
安卓开发只SQLite数据库操作实例
Android简单的SQLite操作及ListView展示数据
学习Android有几天了,今天研究了下SQLite的简单操作,现在分享给奋斗在一线的苦逼程序员们,共勉吧。   Android系统提供了一个SQLiteOpenHelper的一个辅助类,使用此类可以完成对数据库的创建及更新,写了一个简单的类,代码如下: package com.van.sqlite.db; import android.content.Context; import an
获取SQLite数据库中的表信息
1.查询所有表名信息:select * from sqlite_master; select * from sqlite_sequence;
Android:使用SQLite存取数据
Android:使用SQLite存取数据
Android的Sqlite中DateTime类型数据的存取问题
关于讲sqlite中日期类型数据的存取网上有不少,但发现讲得这么细的非常少。更多的是用Date,不用做日期数据统计分析,对存取要求比较小的直接转换成long,即dateTime.getTime()存储。需要在界面上显示的时候就再将long型的日期数据转化为Date或DateTime类型。但是如果要做数据统计分析的话这样每条记录都要遍历转换会显得特别麻烦,数据量大的话时间消费是很大的。
安卓:查询sqlite数据库中的数据,分页加载显示出来
结果: 主逻辑代码文件: package com.example.day14_pageload; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.annota
Android数据库Sqlite查询显示到ListView控件
本次博客来完成上次博客没有完成的项目,从数据库查询的数据显示到listview 话不多说直接上代码 首先我们要自定义一个适配器,继承 Baseadapter 来重写里面的方法 import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.
Android 数据库SQLite Cursor数据遍历读取
Cursor是SQLite 数据库查询返回的行数集合,Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等。以下是Cursor遍历的方法。 工具/原料 编译环境Eclipse 方法/步骤 1 通过query获取数据: SQLiteData
Android程序中读取使用已有的SQLite数据库
方法一: 先在 Manifest 里添加权限: 第一步先判断在指定的路劲是否存在,不存在就创建。第二步将android的资源下的数据库复制到指定路径下面。第三步就是根据指定路径打开或者创建数据库,然后得到操作数据库的对象,得到操作数据库的对象了,自然就可以对数据库中的表进行增删改查等操作了。 SQLiteDatabase db; private final String DA
Android中SQLite的使用(简单数据存入与读取)
一,概要 先看demo,最后又讲解。 二,小demo      效果图:                 实现:                视图层:         testsqlite.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:l