如何让SQLite更快地选择查询

时间:2013-08-06 13:26:10

标签: android sqlite

您好我是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 个答案:

答案 0 :(得分:4)

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

方法是抓住所有,但排序(ORDER BY problem_id)。然后,您可以只检查problemIDs中的每个项目,并在获得匹配时添加。

您也可以将IN运算符用作Mathew suggests,但I don't know how efficient that will be包含1000个项目。

答案 1 :(得分:1)

不要迭代ID集合,而是在IN条件下使用WHERE运算符。

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

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

答案 2 :(得分:0)

您可以尝试compiling a query,也许您可​​以在阅读之前尝试将数据库加载到内存中。

答案 3 :(得分:-1)

problem_id列上创建索引。