2015-12-11 2 views
1

я это подготовить заявление работаяdatabase.query подготовить заявление связывания не работает

String [] selectionArgs = new String[]{level, col1, col1_value}; 

db.query(Table, null,      //table & columns 
     level + " = ? AND " +    //selection 
      "? != ? AND " + 
      "length(" + col1 + ") = " + col1.length, //**here is question point** 
     selectionArgs,     // selectionArgs 
     null, null, "RANDOM()",   // order by 
     Integer.toString(count));   // number of retrieve 

Обратите внимание, что длина является сырым Инлайн. не с "?" и он работает.

Но когда я изменить его в следующем

String [] selectionArgs = new String[]{level, col1, col1_value, 
            col1, Integer.toString(col1.length)}; //added for length 

db.query(Table, null,      //table & columns 
     level + " = ? AND " +    //selection 
      "? != ? AND " + 
      "length(?) = ?", //**here is question point** 
     selectionArgs,     // selectionArgs 
     null, null, "RANDOM()",   // order by 
     Integer.toString(count));   // number of retrieve 

Это не работает больше.

Кто-нибудь не знает, почему это так. Если у вас есть, пожалуйста, дайте мне некоторое объяснение. Благодарю вас всех заблаговременно.

ответ

1

Вы можете использовать ? связывать буквенные значения только, не идентификаторы, такие как имена столбцов.

Таким образом, ? != ? с "col1", "col1_value" args - это то же самое, что и 'col1' != 'col1_value', и выражение всегда верно.

Также length(?) = ? с "col1", "4" - это то же самое, что и length('col1') = 4, что также всегда верно. Но в вашей первой форме у вас есть это как length(col1) = 4, который проверяет длину значения в столбце col1, а не буквально 'col1', поэтому есть шанс, что это правда только для тех строк, которые вас интересуют, и именно поэтому это работает.

0

Как я заметил ваш запрос, вы преобразуете значение Integer в строку с помощью Integer.toString (col1) и чем позже вы пытаетесь сравнить это строковое значение с целочисленным значением длиной (?).

Ваш предыдущий запрос работает, потому что вы не конвертируете свое значение в String. обе длины (col1) возвращают целое число, а значение col1.length также возвращает целое число.

работает запрос (?) -> "длины (" + col1 + ") =" + col1.length, // здесь точка вопрос

, но в этом случае длина возвращает целое число, а следующий "?" который является Integer.toString (col1) является строковым значением, поэтому здесь существует несоответствие типа в случае сравнения. Не работает запрос -> «(?) = Длина », // здесь точка вопрос

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