0

I have a Sqlite3 database in android, with data are sentences like: "good afternoon" or "have a nice day", now I want to have a search box, to search between them, I use something like this :

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

But it only show "good afternoon" as result if user start searching with first "g" or "go" or "goo" or etc, how can I retrieve "good afternoon" as results, if user search like "a" or "af" or "afternoon".

I mean I want to show "good afternoon" result, if user search from middle of a data in sqlite3 db, not only if user searches from beginning.

thanks!

4

1 回答 1

2

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

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

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

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

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

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

MATCH 'afternoon OR evening'

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

于 2013-11-08T22:49:25.710 回答