2016-11-09 2 views
0

Этот запрос не удается обновить (обновлена ​​0):Android SQLite UPDATE с параметризованных WHERE не работает

int updated = db.update(TABLE_NAME, values, 
    COLUMN_NAME_ACCOUNT_ID + "= ? AND " + COLUMN_NAME_TOPIC + "= ?", 
    new String[] { String.valueOf(id), name }); 

Но это работает просто отлично, обновлено = 1:

int updated = db.update(TABLE_NAME, values, 
    COLUMN_NAME_ACCOUNT_ID + "=" + id + 
     " AND " + COLUMN_NAME_TOPIC + "='" + name + "'", 
    null); 

Единственная разница как WHERE строится - явно или через параметры. Что происходит?

SQLite 3.8.10.2 на складе Android-эмулятор.

+0

Во втором примере, вы цитировали 'значения name' –

+1

Да,«имя» это строка, поэтому я процитировал ее. В первом примере SQLite должен указывать его автоматически, не так ли ?. –

+0

Я пробовал это: COLUMN_NAME_ACCOUNT_ID + "=? AND" + COLUMN_NAME_TOPIC + "= '?'", –

ответ

0

В колонке account_id содержатся номера. Сравнение со строкой (String.valueOf(id)) никогда не будет успешным.

В API Android базы данных поддерживает только строковые параметры здесь, так что вы должны вставить идентификатор непосредственно в строку:

int updated = db.update(TABLE_NAME, values, 
     COLUMN_NAME_ACCOUNT_ID + "=" + id + " AND " + COLUMN_NAME_TOPIC + "= ?", 
     new String[] { name }); 
+0

sqlite не заботится о типах – njzk2

+0

Это не совсем яблоки для яблок, но вот пример кода из Google, где он использует параметризованный запрос, сравнивающий числовое поле со строкой: https://github.com/googlesamples/android-BasicSyncAdapter /blob/master/Application/src/main/java/com/example/android/basicsyncadapter/provider/FeedProvider.java#L194 –

+0

Это работает, только если столбец имеет правильное [сродство] (http://www.sqlite.org /datatype3.html#affinity); у вас нет. –

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