1

我有这个代码:

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 类的一部分

它工作正常,但问题是执行时间太长(在我的安卓手机上为 2089 毫秒)。这些字符串是 UI 的一部分,所以我认为我不能把它放在另一个线程中。我该怎么做才能使这段代码运行得更快?

编辑:正好有 110 行

4

2 回答 2

4

而不是单独的语句,你不应该使用 Single sql statement 吗?

只需创建一个 ArrayList 即可将所有需要的值存储在 Activity 类中。

例如:ArrayList<String> myData;

现在在数据库助手类中创建一个函数,如下所示:

 // TO get All Data of datanase which you want
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;   
}

现在在您的活动类中,您可以调用此函数并从 myData ArrayList 中获取所有需要的数据。

myData = db.getAllData(); // i think there is no need of any ID if you are fetching all the data.

希望你明白我的意思。

于 2013-01-24T04:13:41.753 回答
2

你绝对可以在AsyncTask. 您所要做的就是将数据传递给任务的参数,或者如果您无法弄清楚,只需让您的任务有一个构造函数来获取参数并像这样调用它:

MyAsync ma = new MyAsync(stuff, stuff, stuff);
ma.execute();

在任务onPostExecute()中,您可以从后台运行的查询中获取数据,然后您可以更新 UI。

其他人也说得对。如果您可以将最好的查询与这样的表结合起来,那么它并不会真正给您带来很大的性能提升,至少我认为不会。

于 2013-01-24T04:03:57.390 回答