SQL 当我使用 Equals 查询时,查询不起作用

SQL query is not working when I am using Equals query

数据库:

if (DatabaseUtils.queryNumEntries(foodDBHlpr.getWritableDatabase(),FoodDatabaseHelper.TABLE_NAME ) < 1) {

            foodDBHlpr.insertFood("John", "Mashed potato");
            foodDBHlpr.insertFood("Johnson", "Pineapple pie");
           
}

SQL查询

public Cursor getFoodsWithProvidedFood(String provided_food) {
        return this.getWritableDatabase().query(
                TABLE_NAME,
                null,
                COL_2 + " LIKE '%"  +provided_food.replace("'",  "''") + "%' ",
                null,
                null,
                null,
                null
        );

搜索

mCsr = foodDBHlpr.getFoodsWithProvidedFood(alfabetsearch);
      
        while (mCsr.moveToNext()) {
          PreferredFood=mCsr.getString(mCsr.getColumnIndex(FoodDatabaseHelper.COL_3));

        }

当我使用“Like”查询时,一切正常,但是当我查找 John 时,它显示了 John 和 Johnson 的两个结果,因为它们是相似的。 但是当我搜索 John 时,它必须只显示 John(不是 Johnson)的结果。

到目前为止我试过了:

1. COL_2 + "="+""  +provided_food.replace("'",  "''")+",
 1. COL_2 + "="  +provided_food.replace("'",  "''") + " ",

但是没有用 LogCat :

E/SQLiteLog: (1) no such column: John in "SELECT * FROM dataset WHERE Food=John"

    --------- beginning of crash
2022-03-27 18:44:09.867 7571-7639/com.example.humanuz E/AndroidRuntime: FATAL EXCEPTION: Thread-3
    Process: com.example.humanuz, PID: 7571
    android.database.sqlite.SQLiteException: no such column: John (code 1 SQLITE_ERROR): , while compiling: SELECT * FROM dataset WHERE Food=John
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1045)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:652)
        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:590)
        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:61)
        at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
        at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
        at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1545)
        at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1392)
        at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1263)
        at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1431)
        at com.example.humanuz.FoodDatabaseHelper.getFoodsWithProvidedFood(FoodDatabaseHelper.java:60)
        at com.example.humanuz.MainActivity.Search(MainActivity.java:3805)

请指教

这是因为 SQL 如何处理您的查询。在您的 when 子句中,SQL 将 John 引用为 table 列而不是字符串。结果,SQL 试图将 John 查找为 table 列,但失败了。这可以通过简单地在代码库中的值周围添加引号来解决,如下所示:

COL_2 + "'"  +provided_food.replace("'",  "''") + "'"

COL_2 + "\""  +provided_food.replace("'",  "''") + "\""

Like 查询之所以有效,是因为您在值周围放置了 '(单引号)。同样,一旦你在值周围加上一些引号(单引号或双引号),它就会起作用。

您不应将 Java 字符串连接到您的 sql 代码。
这样不安全,不推荐。

使用 query() 的 3d 参数构造 sql 语句的 WHERE 原因,其中 ? 占位符用于您要传递的参数和第 4 个参数应该是具有参数值的字符串数组:

public Cursor getFoodsWithProvidedFood(String provided_food) {
    String selection = COL_2 + " LIKE '%' || ? || '%'";
    String[] selectionArgs = new String[] {provided_food};
    return this.getWritableDatabase().query(
        TABLE_NAME,
        null,
        selection,
        selectionArgs,
        null,
        null,
        null
    );
}

如果您想使用 = 运算符,请将 selection 字符串更改为:

String selection = COL_2 + " = ?"; 

这样,您不必担心参数值中的单引号,因为它们已由方法 query().

处理