Как использовать подготовленное заявление для sql? - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь создать базу данных SQLite в Android, но у меня проблема с этим:

Я пытаюсь обновить текстовое значение в столбце «response» с идентификатором 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 голосов
/ 21 сентября 2018

Проблема, я думаю, в том, что WHERE ID='0' всегда потерпит неудачу;что вы хотите WHERE ID=0

0 голосов
/ 20 сентября 2018

Я почти не использовал подготовленные операторы, поэтому не могу сказать, почему это не работает, но почему бы не использовать метод db.update () ?Он принимает ContentValues ​​в качестве аргумента, аналогичного методу 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;
}

[РЕДАКТИРОВАТЬ] update () возвращает целое число, представляющее количество затронутых строк вместо того, какая строка была затронута.Имейте это в виду, поскольку имя переменной rowId подразумевает, что это не то, что вы ищете.

[EDIT 2] И нет, с методом addData (), который я вижу, проблем нет.Добавленный апостроф не вызвал ошибку, поскольку ContentValues ​​параметризует строковые значения перед их добавлением в базу данных.По сути, весь SQL-подобный синтаксис будет игнорироваться при вставке значений, что отлично подходит для соображений безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...