有没有什么有效的方法来加快Android数据库查询?

问题描述:

在我的Android应用程序中,我需要获得50,000个数据库条目(文本),并在活动开始时将其与值进行比较(位于onCreate())。我用最简单的方法做到这一点:我从数据库获取整个表格到一个游标。然而这种方式太滞后了。有没有其他方法可以更有效地做到这一点?有没有什么有效的方法来加快Android数据库查询?

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

+0

你在比较?字符串,整数? – Bostone 2010-09-03 03:19:40

+0

我在比较字符串。 – dirhem 2010-09-20 18:38:14

总结,并添加更多的

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

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

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

你不应该从UI线程中的数据库读取数据。通过AsyncTask或使用常规线程使用后台线程。这将解决你的UI滞后问题。

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

请查看以下链接:

Painless Threading in Android

YouTube: Writing Zippy Android Apps