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

4

您可能需要考虑将其从数据库中取出。如果您只是抓住了所有问题,则可以将它们全部添加到代码中。运行一个SELECT有 4000 个结果的语句仍然比一千个语句快得多SELECT

方法是把它们全部抓取,但是是 sorted( ORDER BY problem_id)。然后,您可以problemIDs对照它检查每个项目,并在匹配时添加。

您也可以按照Mathew 的建议IN使用运算符,但我不知道集合中有 1000 个项目的效率如何。

于 2013-08-06T13:46:27.257 回答
1

不要遍历 ID 集合,而是在条件中使用IN运算符。WHERE

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

这将返回集合中的所有记录。而您一次查询一个。

于 2013-08-06T13:41:54.717 回答
0

您可以尝试编译查询,也许您可​​以尝试在读取之前将数据库加载到内存中。

于 2013-08-06T13:38:25.227 回答
-1

problem_id在列上创建索引。

于 2013-08-06T13:35:36.887 回答