Android: увеличить поле БД с помощью ContentValues - PullRequest
11 голосов
/ 29 марта 2011

Я обновляю элемент в ListView с помощью метода getContentResolver().update(), и я хотел бы увеличить поле 'views' с помощью ContentValue, но не могу понять, возможно ли это.

Я мог бы сделать это с необработанным SQL SET views = views + 1, но установка ContentValue, например, cv.put("views", "views + 1"), приводит к тому, что поле views явно устанавливается как "views + 1", а не число.

Есть какие-нибудь указатели на это, или я оставил более ручной подход?

Спасибо

Пол

UPDATE:

Я вернулся к использованию необработанного SQL для выполнения обновления, а затем вручную уведомил базовый CursorAdapter об изменении с помощью getContentResolver().notifyChange(). Было бы здорово, если бы я мог найти способ сделать это напрямую через getContentResolver().update(), поэтому, если у кого-то есть способ сделать это, пожалуйста, опубликуйте его здесь.

Ответы [ 3 ]

7 голосов
/ 23 апреля 2011

Мое окончательное решение для этого состояло в том, чтобы использовать пользовательский Uri (по линиям ...item/5/updateviews) через ContentProvider, так что вызов getContentResolver().update(customUri, ...), передающий это Uri, говорит о переопределении моего ContentProvider update()метод увеличения количества просмотров для этого элемента, что позволяет избежать необходимости передавать значения в update() через его параметр ContentValues.

0 голосов
/ 05 февраля 2012

Я реализовал API вызова в своем поставщике контента как способ отправки необработанных / одноразовых SQL-запросов непосредственно в базовую базу данных SQLiteDatabase. Это было достаточно просто.

0 голосов
/ 29 марта 2011
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});

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

...