SQLiteDatabase.rawQuery не возвращает правильные результаты, используя подготовленный оператор - PullRequest
1 голос
/ 06 января 2011

У меня странная и необъяснимая ошибка с моим подготовленным оператором SQL, он не дает таких же результатов, как у подготовленного оператора.

Разве эти две версии не должны давать одинаковые результаты?

Подготовленная версия (с неверными результатами):

<code>sb.append(" WHERE c.deck_id=? AND c.next_date < ? AND c.next_date > 0 AND c.active > 0 AND c.deck_level=?");
...
return db.rawQuery(sb.toString(), new String[] { Long.toString(deckId)
, Long.toString(now), Long.toString(level)});

Неподготовленная версия (работает, как и ожидалось, с правильными результатами):

<code>sb.append(" WHERE c.deck_id=").append(deckId)
.append(" AND c.next_date<").append(now)
.append(" AND c.next_date > 0 AND c.active > 0 AND c.deck_level=").append(level);
...
return db.rawQuery(sb.toString(), null);

Где ошибка в подготовленной версии выписки?

Обновление Я сделал дополнительные журналы для обеих версий.

<code>Log.d(TAG, "selectionArgs1:<em>" + Long.toString(deckId) + "</em>"+Long.toString(now)+ "<em>"+Long.toString(level)+ "</em>");
Вывод: selectionArgs1: * 5 * 1294429481330 * 5 * (SO: не отображается * в источнике?)

<code>StringBuffer d = new StringBuffer("selectionArgs2:<em>");
d.append(deckId).append("</em>").append(now).append("<em>").append(level).append("</em>");
Log.d(TAG, d.toString());
Выход: selectionArgs2: * 5 * 1294429481330 * 5 *

1 Ответ

1 голос
/ 07 января 2011

Я подозреваю, что это как-то связано с типом сходства , но я не смог воспроизвести проблему точно , как вы описываете.

Поведение сходства может повлиятьвыражения сравнения, поэтому «неподготовленный»

next_date < 12345678

может быть не эквивалентен «подготовленному»:

next_date < '12345678'

Обратите внимание на подразумеваемый строковый тип данных, применяемый связыванием «rawQuery» -rawQuery* javadoc говорит:

Значения будут связаны в виде строк.

Я пытался создать тестовый пример сnext_date INTEGER поле безрезультатно.Но, если поле оставить нетипизированным, как в:

CREATE TABLE cards ( next_date );

INSERT INTO cards SELECT 1234;
INSERT INTO cards SELECT '1234';

SELECT 'int', typeof( next_date ), next_date FROM cards WHERE next_date < 1234;
SELECT 'str', typeof( next_date ), next_date FROM cards WHERE next_date < '1234';

, тогда можно увидеть другое поведение сродства - результат:

str|integer|1234

(Возможно, этокомментарий, но его легче читать в формате ответа.)

*http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#rawQuery(java.lang.String,%20java.lang.String[])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...