【问题标题】:How to use wildcards in a SQLite query?如何在 SQLite 查询中使用通配符?
【发布时间】:2018-05-03 14:44:38
【问题描述】:

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

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 compile: SELECT * FROM hadiths WHERE text LIKE %fast%

我知道通配符 %% 和字符串变量项引起了问题,但是如何将字符串变量与通配符一起使用?

【问题讨论】:

  • 使用Log.d() 显示mQuery。如果之后问题不明显,请使用 Logcat 输出更新您的问题。

标签: android sqlite android-sqlite


【解决方案1】:

编辑:

正如 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类型。

【讨论】:

  • 但是 SQL 注入对吗?我期望 '?'在使用中,而不是字符串连接...(尽管您可以将它们添加到项目中,例如 "SELECT... LIKE ?", (f"%{item}%",)
  • @Jiří -- 谢谢你让我诚实!事实上,我发布了一个糟糕的初始答案。我会说 SQLite 文档也应该更加谨慎。再次感谢。
  • 视情况而定。该文档的目的不是告知用户所有可能的威胁和正确/不正确的使用。它会污染页面,并且很难找到特定的功能规格。除非变量来自用户:未知来源,否则原始答案也是安全的。我只是想发出警告,因为很多人只是 CtrlC+V。
猜你喜欢
  • 2019-01-21
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多