如何在SQLite查询中使用通配符?

5

我正在尝试获取包含特定字符串的数据,但查询不起作用,以下是获取数据的方法。

public Cursor getSearch(String item) {
    SQLiteDatabase db = this.getReadableDatabase();
    String mQuery = "SELECT * FROM hadiths WHERE text LIKE %"+item.toString()+"%";
    Cursor cursor = db.rawQuery(mQuery, null);
    return cursor;
}

Logcat显示以下错误。

由于:android.database.sqlite.SQLiteException: near "%": syntax error (code 1): , while compiling: SELECT * FROM hadiths WHERE text LIKE %fast%

我知道通配符%%和字符串变量项导致了问题,但是我该如何在通配符和字符串变量一起使用?


使用 Log.d() 来显示 mQuery。如果这之后问题还不明显,那么请更新你的问题并附上 Logcat 输出。 - Gotiasits
1个回答

8

编辑:

如Jiří所述,应使用参数来帮助防止SQL注入问题。

为了添加参数,您可以执行类似于以下内容的操作:

String mQuery = "SELECT * FROM hadiths WHERE text LIKE ?”;
String param1 = “%” + item + ”%”;

Cursor cursor = db.rawQuery(mQuery, new String [] {param1});

为了添加另一个参数:
String mQuery = "SELECT * FROM hadiths WHERE text LIKE ? AND Name = ?”;
String param1 = “%” + item + ”%”;
String param2 = name;

Cursor cursor = db.rawQuery(mQuery, new String [] {param1, param2});

这段代码有点繁琐,但是它是为了说明参数必须按照应添加到查询的顺序进行添加。
请参阅SQLite文档: https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase
为了后代保存原始答案,请注意SQL注入问题!您需要向查询添加单引号。
String mQuery = "SELECT * FROM hadiths WHERE text LIKE '%"+item+"%'";

请查看SQLite文档:https://www.tutorialspoint.com/sqlite/sqlite_like_clause.htm

注意:无需使用toString(),因为“item”已经是String类型。


1
但是 SQL 注入呢?我期望使用 '?',而不是字符串拼接...(尽管您可以将其添加到项中,例如 "SELECT... LIKE ?", (f"%{item}%",) - Jiří
1
@Jiří -- 感谢您让我保持诚实!的确,我发布了一个糟糕的初始答案。我认为SQLite文档也应该更加谨慎。再次感谢。 - Barns
这要看情况。文档的目的并不是告知用户所有可能的威胁和正确/错误的使用方式。这会污染页面,也很难找到特定的功能规格。原始答案也是安全的,除非变量来自用户:一个未知的来源。我只是想发出警告,因为很多人只是CtrlC+V。 - Jiří

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接