2010-01-01 3 views
0

Один из моих андроид приложений не выполняет следующий конкретную SQLite запроса:Android SQLiteException: нет такой колонки: -1

SELECT _id, hourMin, actions FROM profiles 
WHERE type=2 AND hourMin > -1 AND days & 8 != 0 AND prof_id >> 16 IN (256) 
ORDER BY hourMin ASC LIMIT 1 

Теперь, который работает на некоторых Android телефонов, но на некоторых из них он выходит из строя со следующим ошибка:

android.database.sqlite.SQLiteException: no such column: -1: , while 
compiling: SELECT _id, hourMin, actions FROM profiles WHERE type=2 AND 
hourMin > -1 AND days & 8 != 0 AND prof_id >> 16 IN (256) ORDER BY hourMin 
ASC LIMIT 1 

по какой-то причине, «-1» интерпретируется как столбец, а не числом ... что не имеет особого смысла, и когда я прочитал язык SQLite запросов Я не вижу никакой необходимости, чтобы избежать это число в круглых скобках. Может быть, это проблема другой версии SQLite? Будет ли добавление скобок, это поможет? Вместо этого я, вероятно, перепишу его, используя> = 0, но все же хочу понять, что происходит.

+1

Попробуйте обернуть его в круглые скобки и посмотреть, помогает ли он любому. Это может быть проблема с группировкой в ​​заявлении или чем-то еще. Если бы я был вами, я бы вычислил номер версии sqlite на каждом телефоне, чтобы у вас была точка сравнения. – avpx

+0

Да, это то, что я сделаю, но это случайный снимок. Мне нравится понимать мои исправления :-) К сожалению, я получаю сообщения от пользователей, у меня нет доступа к телефонам самостоятельно. На самом деле пользователю сложно даже догадаться, какая версия SQLite имеет их телефон. На самом деле не могу попросить их настроить ADB на свой телефон, установить SDK на свой рабочий стол, подключить свой телефон через USB и запустить некоторую загадочную командную строку ... :-) – ralfoide

+0

Я не знаю, какие версии SQLite могут даже работать на Android, так что я не буду подвергать опасности это как нечто большее, чем комментарий. Но из журнала изменений я вижу, что побитовые операторы не всегда существовали. Легко представить, что конкретная ошибка, если парсер не распознает побитовые операторы в инструкции. Кроме того, приоритет ~ был зафиксирован в 3.5.3. Опять же, я не знаю, но могу себе представить, что ошибка с приоритетом с ~ также существовала бы с отрицанием (маловероятным, но не полностью исключающим). –

ответ

0

Способ проверки того, что проблема связана с различными версиями SQLite с различными версиями Android без доступа к фактическим телефонам, заключается в создании нескольких изображений эмулятора для разных платформ Android.

Это быстро и легко сделать с помощью инструмента GUI android и позволит узнать, есть ли проблема в разных версиях Android и посмотреть файлы журнала, если это произойдет.

0

Перед выполнением запроса SELECT убедитесь, что таблица создана и не пуста. Обычно ошибка столбца: -1 является причиной из-за пустой таблицы.

Попробуйте этот код, если вы хотите проверить, для создания таблицы:

Cursor c = dbObject.rawQuery(....some query....); 
    try{ 
    c.moveToFirst(); //checking for non-empty table 
    } 
    catch(Exception e){  // in case table is empty 
    ContentValues cv = new ContentValues(); 
    //add some default table entries 
    } 

После этого, если вы ссылки на таблицу вы не получите какой-либо столбец: -1 ошибка.

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