如何使用预备语句的SQL?

时间:2018-09-20 20:11:53

标签: java android database sqlite prepared-statement

我正在尝试在android中建立一个SQLite数据库,但是我有一个问题:

我正在尝试更新ID为0的“响应”列中的文本值。我遇到的第一个问题是,我用于更新的字符串使用了撇号('),并且语法错误,因为sql以'结束字符串。所以我现在为此使用准备好的sql语句。现在的问题是,返回的long给出了-1,这意味着没有行受到影响。那么如何将当前字符串更新为id = 0的行?

注意:第一个字符串也有一个',但使用addData函数添加了它,仅使用db.insert并没有给出任何错误,是这个问题,我应该替换所有我的带有预准备语句的代码?

public boolean addData(String item) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL2, item);

    Log.d(TAG, "addData: Adding " + item + " to " + TABLE_NAME);
    long result = db.insert(TABLE_NAME, null, contentValues);

    //if date as inserted incorrectly it will return -1
    if (result == -1) {
        return false;
    } else {
        return true;
    }
}

public long updateData(String newName){
    SQLiteDatabase db = this.getWritableDatabase();

    String sql = "UPDATE json_response SET response=? WHERE ID='0'";
    SQLiteStatement statement = db.compileStatement(sql);

    statement.bindString(1, newName);  // matches second '?' in sql string
    long rowId = statement.executeInsert();
    return rowId;
}

2 个答案:

答案 0 :(得分:2)

我没有使用准备好的语句,所以我不能说为什么它不起作用,但是为什么不使用db.update()方法呢?它采用ContentValues作为参数,类似于tour addData()方法。试一试。

public int updateData(String newName){
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues cv = new ContentValues();
    cv.put("json_response",newName);

    int rows = db.update(TABLE_NAME, cv, "ID=0", null);
    return rows;
}

[EDIT] update()返回一个整数,该整数表示受影响的行数,而不是受影响的行数。请记住这一点,因为变量名rowId表示这不是您要查找的内容。

[编辑2]并且不,我看到的addData()方法没有问题。添加的撇号不会导致错误,因为ContentValues在将字符串值添加到数据库之前会对其进行参数化。基本上,插入值时将忽略所有类似SQL的语法,这出于安全性考虑而非常有用。

答案 1 :(得分:1)

我认为问题是WHERE ID='0'总是会失败;您想要的是WHERE ID=0