Android: увеличение области DB через ContentValues
Я обновляю элемент в ListView с помощью метода getContentResolver().update()
, и я хотел бы увеличить поле "views" с помощью ContentValue, но не могу понять, возможно ли это.
Я мог бы сделать это с помощью raw SQL SET views = views + 1
, но установка ContentValue, например cv.put("views", "views + 1")
, приводит к тому, что поле представлений явно указывается на "views + 1", а не на число.
Любые указатели на этом, или я ушел на более ручной подход?
Спасибо,
Пол
UPDATE:
Я вернулся к использованию raw SQL для выполнения обновления на данный момент, а затем вручную уведомляет базовый CursorAdapter об изменении через getContentResolver().notifyChange()
. Было бы здорово, если бы я мог найти способ сделать это непосредственно через getContentResolver().update()
, поэтому, если у кого-то есть способ сделать это, отправьте его здесь.
Ответы
Ответ 1
Моим окончательным решением было использовать пользовательский Uri
(вдоль строк ...item/5/updateviews
) через ContentProvider
, так что вызов getContentResolver().update(customUri, ...)
, передающий этот Uri
, говорит моему переопределенному ContentProvider update()
метод для увеличения количества просмотров для этого элемента, что позволяет избежать необходимости передавать значения update()
с помощью параметра ContentValues
.
Ответ 2
Я реализовал API вызовов для своего поставщика контента как способ отправки исходных/одноразовых SQL-запросов непосредственно в базовую базу данных SQLiteDatabase. Это было достаточно легко.
Ответ 3
String key = "1";//some value where you want to update
int currentCount = 5;//the existing value of the count field
ContentValues values = new ContentValues();
values.put("my_counter_field", currentCount + 1);
int updatedRows = database.update("my_table_name", values, "my_where_field = ?", new String[] {key});
что-то подобное для использования ContentValues
.
возможно, более простой маршрут может быть:
database.execSQL("UPDATE my_table_name SET my_counter_field = my_counter_field + 1 WHERE my_where_field = ?", new Object[] {key});
или, возможно, даже использовать триггер. Посмотрите этот вопрос, чтобы узнать, соответствует ли он вашим потребностям: Использовать триггер для автоматического увеличения