您好我是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
内完成的,但是花了太多时间。
如何以更快的性能有效地完成此操作?
答案 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
列上创建索引。