【问题标题】:Search data from sqlite3 database in android在android中从sqlite3数据库中搜索数据
【发布时间】:2013-11-08 22:14:24
【问题描述】:

我在android中有一个Sqlite3数据库,数据是:“下午好”或“有美好的一天”,现在我想要一个搜索框,在它们之间进行搜索,我使用这样的东西:

 Cursor cursor = sqliteDB.rawQuery("SELECT id FROM category WHERE sentences LIKE '"+ s.toString().toLowerCase()+ "%' LIMIT 10", null);

但是如果用户开始搜索第一个“g”或“go”或“goo”等,它只会显示“下午好”作为结果,如果用户搜索“a”,我如何检索“下午好”作为结果" 或 "af" 或 "下午"。

我的意思是我想显示“下午好”的结果,如果用户从 sqlite3 db 中的数据中间搜索,而不仅仅是用户从头开始搜索。

谢谢!

【问题讨论】:

  • 尝试删除查询中的% 符号。如果sentencesTEXT 类型,则只需将查询变量用单引号括起来。
  • @Razgriz 实际上我在字符串之前添加了另一个 % ,它解决了它。

标签: android search sqlite android-sqlite


【解决方案1】:

只需将百分号放在查询字符串前面:LIKE '%afternoon%'。但是,您的方法有两个缺陷:

  1. 它很容易受到 SQL 注入攻击,因为您只是将未经过滤的用户输入插入到 SQL 查询字符串中。通过重写查询来使用查询参数语法,如下所示: SELECT id FROM category WHERE sentences LIKE ? LIMIT 10。将用户输入字符串作为选择参数添加到您的 query method call

  2. 您的数据库越大,速度就会越慢,因为LIKE 查询没有针对快速字符串匹配和查找进行优化。

为了解决第 2 个问题,您应该使用 SQLite 的 FTS3 extension,它可以大大加快任何与文本相关的搜索。您将使用 MATCH 运算符而不是 LIKE,它使用不同的查询语法:

SELECT id FROM category WHERE sentences MATCH 'afternoon' LIMIT 10

如您所见,MATCH 运算符不需要百分号。它只是尝试在正在搜索的整个文本中找到任何出现的单词(在您的情况下为sentences 列)。通读我链接到的 FTS3 的文档。 MATCH 查询语法为在数据库表中查找文本提供了一些更方便且功能强大的选项,这些选项与早期的搜索引擎查询语法非常相似,例如:

MATCH 'afternoon OR evening'

FTS3 扩展的唯一(次要)缺点是它通过创建额外的搜索索引表和元数据来扩大数据库文件的大小。但我认为这个用例非常值得。

【讨论】:

  • 感谢您的完整回答和解释。 :)
猜你喜欢
  • 2016-03-22
  • 2018-02-06
  • 2011-12-31
  • 1970-01-01
  • 2016-05-18
  • 2012-11-23
  • 1970-01-01
相关资源
最近更新 更多