当前位置: 首页 > 知识库问答 >
问题:

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

夏侯弘光
2023-03-14

数据库:

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的两个结果,因为它们是相似的。但当我搜索约翰时,它必须只显示约翰(而不是约翰逊)的结果。

到目前为止,我试过:

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)

请给我一个提示。

共有2个答案

卜方伟
2023-03-14

不应该将Java字符串连接到sql代码
这不安全,不建议使用

使用query()的3d参数来构造sql语句的WHEREcause with 要传递的参数的占位符,以及第四个参数,它应该是一个包含参数值的字符串数组:

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
    );
}

如果要使用=运算符,请将选择字符串更改为:

String selection = COL_2 + " = ?"; 

这样,就不用担心参数值中的单引号,因为它们由方法query()处理。

司徒嘉祥
2023-03-14

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

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

或者

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

Like查询之所以有效,是因为您在值周围放置了(单引号)。类似地,一旦在值周围加上一些引号(单引号或双引号),就可以了。

 类似资料:
  • 问题内容: 我正在使用嵌套集模型在iPhone上的本地SQLite数据库中存储较大的数据层次结构。我从他们的网站上阅读了MySQL技术文章,了解如何执行此操作,但是他们建议的查询(以及我需要的查询)之一似乎不适用于SQLite,并且我不确定如何解决它。 SQLite报告不是列,我认为这是因为其子查询实现不完整。有人对如何解决此限制有任何想法吗? 查询的目的是获取给定父节点的所有直接子代。 问题答案

  • 你能帮我解决这个问题吗?我想使用此方法在我的数据库中查找特定的缺口(它是由Apache Derby制作的)。我使用了EntityManager并从NetBeans中的数据库中映射持久性-实体类。 我得到这个错误: Java . lang . illegalargumentexception:在EntityManager中创建查询时出现异常:< br >异常描述:解析[SELECT * FROM U

  • 问题内容: 非常感谢你的帮助。我有一个和表。位置 我对位置模型执行以下查询。 然后,我要对其执行附加查询并根据以下内容对其进行过滤 该查询并 没有 工作。它返回一个空对象。 这是参数: location_params 1} permitted: true> ads_params 1} permitted: true> 不允许这样输入特定的列: 我有postgresql,我没有考虑过使用SQL,但是

  • 我想让ElasticSearch在我的盒子上工作。我有以下映射: 所以我有一个“运动鞋”索引,它有一个“运动鞋”类型,一个“品牌”属性,它有一个“ID”和一个“标题”。 检查运动鞋是否存在,运行curl-xget“http://localhost:9200/sneakers/sneaker/1?prettley”,我得到: 现在,runningcurl-xget'http://localhost:

  • 问题内容: 我有一个非常简单的查询,像这样: 我的默认设置是或某些用户ID,但是由于某种原因,该查询总是返回0行,我也尝试过,但还是没有运气,这可能是什么错误? EDTI 因此,在运行更多查询后,我发现我的问题是字段的默认值,因此我修改了查询,现在可以正常使用: 问题答案: NULL值需要特殊处理:http : //dev.mysql.com/doc/refman/5.1/en/working-w

  • 问题内容: 我有一个单元格,其中包含用双管道分隔的值。我正在尝试使用以下内容搜索此单元格的内容,(其中10是要搜索的数字)%10、10%,%10%和10 我的查询似乎只返回10。没有其他变化。有人可以告诉我为什么它不起作用吗? 提前谢谢了。(您在下面看到的SQL查询是从准备好的PDO查询语句中导出的内容) 问题答案: 我认为您应该使用LIKE而不是=: