有没有有效的方法使Android数据库查询更快?

时间:2010-09-03 03:16:30

标签: android sqlite

在我的Android应用中,我需要获取50,000个数据库条目(文本),并在活动开始时将其与值进行比较(在onCreate()中)。我用最简单的方法做到这一点:我将整个表从db到光标。然而这种方式太迟钝了。有没有其他方法可以更有效地做到这一点?

编辑:该应用是“拼字游戏解算器”,这就是我在查询中不使用WHERE子句的原因(获取整个数据并将其与输入字母的组合进行比较) 。起初我正在使用一个包含完整可能单词的大表。现在我使用26张桌子。这减少了滞后,我在一个线程上进行数据库调用 - 这也解决了很多问题。它仍然有点滞后但更好。

4 个答案:

答案 0 :(得分:9)

总结并添加更多内容

  1. 让数据库完成搜索工作,在执行查询时使用WHERE子句!
  2. 如果您的where子句不在主键列或唯一列上运行,则应为该列创建索引。以下是有关如何执行此操作的一些信息:http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html#indexes
  3. 谷歌说:“使用问号参数标记,例如'phone =?'而不是选择参数中的显式值,因此只有这些值不同的查询才会被识别为缓存目的。“
  4. 使用EXPLAIN QUERY PLAN http://www.sqlite.org/lang_explain.html运行查询分析并查找任何scan操作,这些操作比search操作慢得多。使用索引来避免scan操作。
  5. 请勿在{{1​​}}执行任何耗时的任务,始终使用onCreate(),在后台线程或其他非主线程上运行AsyncTask
  6. 如果您需要进行全文搜索,请阅读:http://www.sqlite.org/fts3.html

答案 1 :(得分:2)

您永远不应该在UI线程中读取数据库。通过AsyncTask或使用常规线程使用后台线程。这将解决您的UI延迟问题。

使数据库读取更快将有助于更快地将数据带给用户,但更重要的是,获取数据不会阻止用户使用该应用程序。

查看以下链接:

Painless Threading in Android

YouTube: Writing Zippy Android Apps

答案 2 :(得分:1)

在SQL中使用WHERE子句而不是读取整个内容。然后在WHERE子句中的列上添加索引。

答案 3 :(得分:1)

至少你可以在你比较的字段上加上索引并使用WHERE子句。如果您要比较数字Sqlite(Android使用的数据库引擎)支持MINMAX等功能。此外,如果您要比较部分字符串,可以使用LIKE。对于查询优化,有许多资源such as this