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()
.
处理
数据库:
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()
.