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});

или, возможно, даже использовать триггер. Посмотрите этот вопрос, чтобы узнать, соответствует ли он вашим потребностям: Использовать триггер для автоматического увеличения