【问题标题】:Android SQLite rawQuery with WHERE clause returns search string as column not found带有 WHERE 子句的 Android SQLite rawQuery 将搜索字符串作为未找到的列返回
【发布时间】:2014-09-05 10:45:47
【问题描述】:

我创建了一个名为 CHEMISTID 的表:

private static final String CREATE_TABLE_CHEMISTID = "CREATE TABLE "
        + CHEMISTID + "(" + KEY_ID + " INTEGER PRIMARY KEY, " + KEY_CHEMISTID
        + " TEXT" + ")";

我的插入函数可以正常工作,但是当我使用以下查询语句运行搜索查询以查找 chemistId 是否已经存在时:

String selectQuery = "SELECT  * FROM " + CHEMISTID +" WHERE " + KEY_CHEMISTID + " = "+ chemistID + ";";

Cursor c = db.rawQuery(selectQuery,null);

我的 logcat 显示以下错误消息:

E/AndroidRuntime(1169): FATAL EXCEPTION: main
E/AndroidRuntime(1169): android.database.sqlite.SQLiteException: no such column: Spain (code 1): , while compiling: SELECT  * FROM chemistIdTable WHERE chemistId = Spain;

西班牙是我在程序中动态创建的特定 chemistId。

我应该如何修复我的 selectQuery 字符串,以便它在列名 KEY_CHEMISTID 中搜索特定字符串 chemistId?

【问题讨论】:

    标签: java android sqlite


    【解决方案1】:

    您需要在 SQL 中引用您的字符串,例如 Spain,以便它们被视为字符串文字而不是列名标识符。你可以使用像'Spain' 这样的单引号。

    但是,最好使用? 参数占位符并在选择参数数组中提供参数值,例如:

     ... KEY_CHEMISTID + "=?" ...
    
    c = db.rawQuery(selectQuery, new String[] { chemistID });
    

    【讨论】:

    • 非常感谢您不仅向我展示了正确答案,还让我理解了它背后的逻辑。为了对带有子查询的复杂查询实现相同的逻辑,我应该将其拆分为不同的查询字符串吗?字符串 selectQuery = "SELECT * FROM " + DATE + " WHERE " + KEY_ID + " = '(SELECT " + KEY_DATE_ID + " FROM " + CHEMISTID_DATE_ORDERNUMBER_ORDERDATA + " WHERE " + KEY_CHEMISTID_ID + " = '(SELECT " + KEY_ID + " FROM " + CHEMISTID + " WHERE " + KEY_CHEMISTID + " = " + chemistId +")')' AND " + KEY_DATE + " = ' " + date + " ' ";
    • 查询字符串中可以有多个?。只需在选择参数数组中提供等量的值。
    • 这是正确的解决方案吗? String selectQuery = "SELECT * FROM " + DATE + " WHERE " + KEY_ID + " = (SELECT " + KEY_DATE_ID + " FROM " + CHEMISTID_DATE_ORDERNUMBER_ORDERDATA + " WHERE " + KEY_CHEMISTID_ID + " = (SELECT " + KEY_ID + " FROM " + CHEMISTID + " WHERE " + KEY_CHEMISTID + " =? "+")) AND " + KEY_DATE + " =?"; Log.e(LOG, selectQuery); SQLiteDatabase db = this.getReadableDatabase(); Cursor c = db.rawQuery(selectQuery, new String[] { chemistId,date});
    【解决方案2】:

    你错过了单引号,所以改变

    String selectQuery = "SELECT  * FROM " + CHEMISTID +" WHERE " + KEY_CHEMISTID + " = "+ chemistID + ";";
    

    String selectQuery = "SELECT  * FROM " + CHEMISTID +" WHERE " + KEY_CHEMISTID + " = '"+ chemistID + "';";
    

    推荐的解决方案是使用参数化查询作为

    Cursor c = db.query(CHEMISTID, null, KEY_CHEMISTID + "=?",
                new String[] { chemistID  },null, null, null, null);
    

    【讨论】:

    • 非常感谢您的解决方案!我意识到了这个错误,它现在可以工作了。但是,如果我使用参数化查询并且如果其中一个参数失败,它将使我的输入应用程序崩溃。稍后在我的应用程序中,我还使用了几个复杂的子查询,它们不适合在参数化查询中使用
    猜你喜欢
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多