Подтвердить что ты не робот

Android.database.sqlite.SQLiteDatabase.rawQuery() не обновляет столбец DATETIME с помощью функции SQLite datetime()

public Cursor set_datetime_next(Reminder r) {       
    String _newVal = "datetime('now', '+7 days')";
    String[] args = { new Integer(r.getID()).toString() };
    String query =
        "UPDATE " + DBConst.TABLE
      + " SET "   + DBConst.f_DATETIME_NEXT + "=" + _newVal
      + " WHERE " + DBConst.f_ID +"=?";
    Log.i(TAG, query);
    return db.rawQuery(query, args);
}

Я также попытался передать в datetime('now', '+7 days') как связанный параметр, который не будет работать, поскольку документация на Android говорит:

Значения будут связаны как строки.

Литература:

4b9b3361

Ответ 1

Курсор не был закрыт.

public void set_datetime_next(Reminder r, String _newVal) {     
    String[] args = { new Integer(r.getID()).toString() };
    String query =
        "UPDATE " + DBConst.TABLE
      + " SET "   + DBConst.f_DATETIME_NEXT + "=" + _newVal
      + " WHERE " + DBConst.f_ID +"=?";
    Log.i(TAG, query);
    Cursor cu = db.rawQuery(query, args);
    cu.moveToFirst();
    cu.close();     
}

В то время как это имеет смысл, то, что действительно озадачивает меня, - это требование вызова moveToFirst() (или некоторой другой функции, которая каким-то образом "будет работать с" курсором).
Без вызова как moveToFirst(), так и close() строка никогда не обновлялась. close() сам по себе после rawQuery() ничего не сделал.

Ответ 2

Поскольку это оператор UPDATE, вы можете использовать execSQL(), а не rawQuery(). Вам не придется беспокоиться о курсорах (что довольно глупо для оператора UPDATE).
Однако вам нужно будет поместить значения в свой оператор WHERE вместо передачи args, поскольку execSQL() принимает только один аргумент String для вашего оператора SQL. Кроме того, execSQL() имеет тип void.

Я использую execSQL() только для всех операторов SQL, кроме SELECT...