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 говорит:
Значения будут связаны как строки.
Литература:
Ответы
Ответ 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
...