1

データベースからデータを収集するアクティビティにこのコードがあります。アクティビティが開くまでに 5 秒かかります。これがないと、アクティビティを開くのに 2 秒かかります。このコードを最適化する方法はありますか?

すべての配列 (ループ内の配列: arr_calllog_name0 を含む) には、私の電話に 61 個のアイテムがあります。エミュレーターでは高速で、6 つの項目があります。

for (int i=0; i<arr_calllog_name0.size(); i++)
    {


        Cursor crname = info.getAllTitles_Stats2A(arr_calllog_name0.get(i), "1", d1, d2);
        crname.moveToFirst();
        count_in = crname.getInt(0);
        arr_calllog_numberin0.add(String.valueOf(count_in));



        Cursor crname2 = info.getAllTitles_Stats2A(arr_calllog_name0.get(i), "2", d1, d2);
        crname2.moveToFirst();
        count_out = crname2.getInt(0);
        arr_calllog_numberout0.add(String.valueOf(count_out));



        Cursor crname3 = info.sumAllTitles_StatsA(arr_calllog_name0.get(i), "1", d1, d2);
        crname3.moveToFirst();
        sum_in = crname3.getInt(0);
        arr_calllog_durationin0.add(String.valueOf(sum_in));



        Cursor crname4 = info.sumAllTitles_StatsA(arr_calllog_name0.get(i), "2", d1, d2);
        crname4.moveToFirst();
        sum_out = crname4.getInt(0);
        arr_calllog_durationout0.add(String.valueOf(sum_out));

    }

info は次のように宣言されてHotOrNot info = new HotOrNot(ChartsDuration.this);います。ここで、HotOrNot は DbHelper を含むクラスであり、SQLiteOpenHelper クラスを拡張します。

1つのクエリは(もう1つはほぼ同じです)

public Cursor getAllTitles_Stats2A(String name, String type, String date1, String date2) {
        return ourDatabase.rawQuery("SELECT COUNT(*) FROM " + DATABASE_TABLE + " WHERE " + KEY_DATE + " BETWEEN '" + date1 + "'" + " AND '" + date2 + "'" + " AND " + KEY_NAME + " = '" + name + "'" + " AND " + KEY_TYPE + " = '" + type + "'" + " COLLATE NOCASE", null);
    }

DATABASE_TABLE には、携帯電話に 500 個のアイテムがあります。

4

1 に答える 1

2

このようにカーソルを使用しないでください。カーソルは貴重であるため(事実上、カーソルはポインターではなくデータのテーブルです)、CPU時間の観点から作成するにはコストがかかります。あなたの例には2つの非常に深刻な問題があります。

  1. forループでクエリを実行しないでください
  2. 終了したら、必ずカーソルを閉じてください

JOINを使用してこれを行う方法を見つけることができれば、成功する可能性が高くなりますが、より多くの情報がなければ、問題に対してより明確な解決策を提供することは困難です。

于 2012-06-09T12:05:47.427 に答える