【问题标题】:Android SQLite very slow lookupAndroid SQLite 查找速度很慢
【发布时间】:2012-03-14 20:46:24
【问题描述】:

我正在尝试在 Android 上创建一个字典应用程序。我有一个包含 80000 篇文章的数据库。当用户在EditText 中输入单词时,我想在 ListView 中显示建议,为此我使用以下代码:

    public Cursor query(String entry){
             String[] columns = new String[]{"_id", "word"};
             String[] selectionArgs = new String[]{entry + "%"};
             return mDB.query("word", columns, "word LIKE ?", selectionArgs, null, null, null);
    }

我使用 SimpleCursorAdapter 作为 ListView。

问题是建议出现得很晚。我认为原因是 SQL 中的LIKE。我不知道有任何其他方法可以做到这一点。我能做些什么来提高获得建议的性能吗?

【问题讨论】:

  • 您应该有一个单独的表格,其中包含每篇文章的关键字,并在那里进行搜索。否则无济于事。
  • @coderdem 计划提出多少建议?它会是一种简单的自动完成功能吗?还是真的打算在 suggestions 结果列表中显示数以千计的搜索结果?如果不是后者,为什么不使用 limit
  • @SergeyBenner 单词字段的大小在 5 到 150 个字符之间。
  • @Zortkun 我想展示所有可能的建议。用户应该能够向下滚动 ListView 并查看所有可能的单词。

标签: android sqlite listview search


【解决方案1】:

您可能会发现在word 列上添加索引有很大帮助。见the documentation

所以你可以在创建表之后尝试这个:

CREATE INDEX word_idx ON word (word);

(注意:我不确定将表和列都命名为word 是否会导致语法问题。试试看!)

【讨论】:

  • 错误。不应盲目地在文本字段上创建索引,尤其是文章等。
  • 我认为该列包含单个单词,而不是整篇文章,正如名称 word 所证明的那样。
  • @GrahamBorland 单词字段已排序。但是,由于它包含土耳其语字符,因此它是根据土耳其语排序的。我不知道这是否重要。
  • 即使单词已经排序,SQLite 也不知道这一点。所以索引仍然是一个好主意。我已经编辑了答案。
  • @coderdem 如果您打算使用查询like '%word%',但不会使用索引。
【解决方案2】:

除了明显的索引之外,如果这是一本字典,您应该考虑使用带有 MATCH 而不是 like 的全文搜索。 Android 应该支持 FTS3。

查看http://www.sqlite.org/fts3.html 并在此处查看有关 Android 上 fts3 的一些答案。

似乎单词应该以字符串开头。 也许这种技巧会有所帮助:SQLite FTS3 simulate LIKE somestring%

【讨论】:

  • 我从未听说过 FTS3。我会检查的。
  • 全文搜索。您通常使用全文搜索在数据库中进行快速字符串查找。
【解决方案3】:

作为一种简单的替代方法,您可以使用Limit 以任意顺序限制建议,如本文所示:Using the LIMIT statement in a SQLite query

mDB.query("word", columns, "word LIKE ?", selectionArgs, null, null, null, "LIMIT 150" );

由于所有结果都是同样有效的建议,因此顺序无关紧要。

此外,无论如何您都无法显示大量建议,因此您可以根据您的 UI 简单地使用一些固定的限制计数。我以 150 为例。

希望对你有帮助..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多