我在android中有一个Sqlite3数据库,数据是句子:“下午好”或“有美好的一天”,现在我想要一个搜索框,在它们之间搜索,我使用这样的东西:< / p>
Cursor cursor = sqliteDB.rawQuery("SELECT id FROM category WHERE sentences LIKE '"+ s.toString().toLowerCase()+ "%' LIMIT 10", null);
但是如果用户开始用第一个“g”或“go”或“goo”等搜索,它只显示“下午好”,如果用户搜索“a”,我怎样才能检索“下午好”作为结果“或”af“或”下午“。
我的意思是我想显示“下午好”的结果,如果用户从sqlite3 db中的数据中间搜索,不仅仅是用户从头开始搜索。
谢谢!
答案 0 :(得分:2)
只需将百分号放在查询字符串前面:LIKE '%afternoon%'
。但是,您的方法有两个缺陷:
它很容易受到SQL注入攻击,因为您只是将未经过滤的用户输入插入到SQL查询字符串中。使用查询参数语法,而不是重写您的查询,如下所示:
SELECT id FROM category WHERE sentences LIKE ? LIMIT 10
。将用户输入字符串作为选择参数添加到query method call
数据库增长越大,速度就越慢,因为LIKE
查询未针对快速字符串匹配和查找进行优化。
为了解决2号问题,你应该使用SQLite的FTS3 extension,它可以大大加快任何与文本相关的搜索速度。您将使用使用不同查询语法的LIKE
运算符代替MATCH
:
SELECT id FROM category WHERE sentences MATCH 'afternoon' LIMIT 10
正如您所见,MATCH
运算符不需要百分号。它只是试图在正在搜索的整个文本中找到任何单词的出现(在您的情况下为sentences
列)。仔细阅读我链接到的FTS3的文档。 MATCH查询语法提供了一些非常方便和强大的选项,用于在数据库表中查找与早期搜索引擎查询语法非常相似的文本,例如:
MATCH 'afternoon OR evening'
FTS3扩展的唯一(次要)缺点是它通过创建额外的搜索索引表和元数据来破坏数据库文件大小。但我认为这个用例非常值得。