1

こんにちは、私はかなり新しくSQLite、プロジェクトでいくつかのデータベース操作に対処しようとしています。

ほぼ4000行のテーブルがあり、これはすべての行の形式です:

problem_id (string)
problem_no (string)
problem_title (string)
dacu (int)

problem_noに基づいて一連のクエリを実行する必要がありますproblem_id。クエリの量は、一度にほぼ 1000 です。そこで、次のようなクエリ コードを作成しました。

Set<Integer> getProblemsTitle(HashSet<String> problemsIDs) {
        SQLiteDatabase db = this.getReadableDatabase();
        HashSet<Integer> problemNo = new HashSet<Integer>();
        Cursor cursor = null;
        for (Iterator<String> iterator = problemsIDs.iterator(); iterator.hasNext();) {
            cursor = db.query(CommonUtils.PROBLEM_TABLE, new String[] {
                    CommonUtils.KEY_PROBLEM_NO },
                    CommonUtils.KEY_PROBLEM_ID + "=?",
                    new String[] { iterator.next() }, null, null, null, null);
            if (cursor != null && cursor.moveToFirst()) {
                problemNo.add(cursor.getInt(0));
            }
            cursor.close();
        }
        db.close();
        Set<Integer> set = new TreeSet<Integer>(problemNo);
        return set;
    }

これが最適化されたスニペットではないことはわかっています。そして、クエリの実行時間を短縮するために、それを大幅に最適化する必要があります。中でやりAsyncTaskましたが、時間がかかりすぎます。

より高速なパフォーマンスでこれを効率的に行うにはどうすればよいですか?

4

4 に答える 4

1

ID のコレクションを反復処理しないでください。条件INで演算子を使用してください。WHERE

SELECT * FROM Table WHERE problem_id IN (1,2,3,4,5)

これにより、セット内のすべてのレコードが返されます。一度に1つずつクエリを実行しているのに対して。

于 2013-08-06T13:41:54.717 に答える
0

query のコンパイルを試すことができます。また、読み取る前にデータベースをメモリにロードすることもできます。

于 2013-08-06T13:38:25.227 に答える
-1

列にインデックスを作成しproblem_idます。

于 2013-08-06T13:35:36.887 に答える