为什么我的查询崩溃了?

时间:2011-12-31 14:23:28

标签: android database sqlite

我编写了以下数据库查询。 但是,当我访问显示结果的列表活动时,应用程序崩溃。

我已经将错误跟踪到下面的方法(其他更简单的查询方法可以正常工作):

public Cursor fetchInterface_HSE_Entries(String string) throws SQLException{
    String[] columns = new String[] {KEY_ROW_ID_INTERFACE, KEY_TEXTVIEW_VALUE, KEY_CATEGORY_OPTIONS, KEY_WORKSCREEN};
    String whereClause = KEY_WORKSCREEN+"=" + string;
    Cursor cursor = db.query(TEXTVIEWS_TABLE, columns, whereClause, null, null, null, null);

    if(cursor != null){
        cursor.moveToFirst();
    }
    return cursor;
}

这是我的错误日志的一部分:

12-31 16:13:38.851: E/AndroidRuntime(480): Caused by: android.database.sqlite.SQLiteException: no such column: testInterface1: , while compiling: SELECT _id, textviewvalue, categoryoptions, workscreen FROM interfacetable WHERE workscreen=testInterface1

5 个答案:

答案 0 :(得分:1)

尝试:

String whereClause = KEY_WORKSCREEN+"='" + string + "'";

您需要在查询中引用文本值,否则它们将被解释为列名(或函数,或其他)。

请注意,这对SQL注入攻击是不安全的,您应该使用绑定变量。

String whereClause = KEY_WORKSCREEN+" = ?";
Cursor cursor = db.query(TEXTVIEWS_TABLE, columns, whereClause, 
                         new String[]{string}, null, null, null);

答案 1 :(得分:1)

因为你没有在whereClause周围加上引号。 尝试:

String whereClause = KEY_WORKSCREEN+"='" + string + "'";

您可以在错误日志中清楚地看到它:

SELECT _id, textviewvalue, categoryoptions, workscreen FROM interfacetable WHERE workscreen=testInterface1

应该是:

SELECT _id, textviewvalue, categoryoptions, workscreen FROM interfacetable WHERE workscreen='testInterface1'

答案 2 :(得分:1)

SELECT _id, textviewvalue, categoryoptions, workscreen FROM interfacetable WHERE workscreen=testInterface1

由于错误说你在接口表中没有testInterface1 collumn,我认为你的sql语句中应该有值而不是testInterface1。在db中运行查询,您将看到相同的错误。

答案 3 :(得分:1)

您需要将where子句中的字符串值放入引号。

答案 4 :(得分:1)

Workscren是字符串编辑您的查询并添加单引号。 Key-workscreen +“=”'+ string +'“就像那样