2010-08-06 4 views
18

Я пытаюсь увеличить значение целочисленного ключа в строке в моей таблице. Однако ничего действительно не происходит.Увеличьте значение записи в базе данных android/sqlite

db.rawQuery("UPDATE table SET key = key + 1 WHERE name=?", new String[] {name}); 

Однако, этот код работает отлично (просто устанавливает ключ жестко предопределенным значением): '?'

ContentValues values = new ContentValues(); 
    values.put("key", 2); 
    db.update("table", values, "name=?", new String[] {name}); 

также попытался а не просто?, но это привело к ошибке во время выполнения.

+1

Попробовал ли «db.rawQuery (« UPDATE table SET key = key + 1 WHERE name = 'name »и передал значение null вместо строки [], потому что этот вид оператора отлично подходит для меня ... – Sephy

+0

Проверка работоспособности: если «ключ» объявлен как первичный ключ, вы уверены, что новое значение ключа еще не существует? – MPelletier

+0

При использовании WHERE name = 'name' он ничего не делает. Name = '?' throws: android.database.sqlite.SQLiteException: индекс привязки или столбца за пределами диапазона: handle 0x292660. Он не объявляется как первичный ключ или что-то другое странное, простое непустое целое, должно быть установлено равным нулю из что я могу сделать, чтобы попытаться изолировать проблему? – nip3o

ответ

14

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html От:

общественного курсора rawQuery (String SQL, String [] selectionArgs)

Запускает при условии SQL и возвращает указатель на набор результатов. Возвращает Cursor объект, который расположен перед первой записью

по сравнению с:

общественной ничтожной ExecSQL (String SQL, Object [] bindArgs)

Выполнить один оператор SQL это не запрос. Например, CREATE TABLE, DELETE, INSERT и т.д.

Другими словами, SQL запросы, которые возвращают таблицу будут работать с rawQuery, и те, которые не возвращают таблицы будут работать с execSQL.

+1

Я все еще не понимаю. Если rawQuery действительно «запускает предоставленный SQL», как указано в документах, я не понимаю, почему он не будет работать для каких-либо SQL-операторов. Конечно, это всего лишь теоретический вопрос, но все же немного странный. – nip3o

+1

Это все еще хороший вопрос. Ответ должен лежать с предложением where. Я не знаю, как андроид относится к этой функции, но если одна функция цитирует строковый аргумент, а другая - нет, это может объяснить, почему число не увеличивается. Тем не менее, в примере кода, который я видел, 'db.update', кажется, популярен. Более того, чем 'db.execSQL (" UPDATE ... ' – MPelletier

Смежные вопросы