Как исправить ошибку запроса sqlite, где?не заменяются аргументами выбора - PullRequest
0 голосов
/ 09 апреля 2019

Мое приложение - это словарь, и сейчас я работаю над тем, чтобы сделать его доступным в автономном режиме.База данных загружена, и теперь у нас ситуация, что нет интернета.Мне нужно использовать локальную базу данных.Я получаю свою читаемую базу данных, а затем настраиваю запрос.На моем собственном тестовом телефоне все отлично работает.Но теперь, прежде чем опубликовать обновление, я попробовал его на двух других телефонах, просто чтобы увидеть, что?в выделении не заменяются значения в selectionArgs.

Отладчик просто показывает, что оператор sql был создан без замены в выделении.

Он работает на моем телефоне на Android 8.1, но с двумя более низкими телефонами он перестает работатьи у меня нет идей.

Я также пытался изменить его на db.rawQuery (), но это закончилось тем же результатом.

    String selection = "eng LIKE ? OR oky LIKE ? OR engpl LIKE ? OR okypl LIKE ? OR engcom LIKE ? OR okycom LIKE ? OR Alternative LIKE ?";
    String[] selectionArgs = {term, term, term, term, com, com, term};
    String orderBy = "eng, oky ASC";
    Cursor cursor = db.query(DictionaryContract.WordEntry.TABLE_NAME, null, selection, selectionArgs, null, null, orderBy);

Теперь я ожидал, что результат даст мнетермины, которые соответствуют слову (термину), которое искало пользователь, но вместо этого курсор остается пустым, поскольку нет термина, содержащего знак вопроса.

Особенно сбивает с толку то, что он работает на одном телефоне, а не на других.

1 Ответ

0 голосов
/ 09 апреля 2019

Отладчик не будет отображать разрешенные?, Поскольку замена? Выполняется базовым SDK (реализация sqlite), который находится в C, а не в Java.

Лучшее, что выможно увидеть bindArgs, например, для следующего кода: -

    csr = mDBhlpr.getWritableDatabase().query("table1",null,"id=?",new String[]{"1"},null,null,null);
    while (csr.moveToNext()) {
        long id = csr.getLong(csr.getColumnIndex(DBHelper.COL_TABLE1_ID));
    }

с точкой останова в 1-й строке, тогда вы можете получить: -

enter image description here

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

Cursor cursor = db.query(DictionaryContract.WordEntry.TABLE_NAME, null, selection, selectionArgs, null, null, orderBy);

На

Cursor cursor = db.query(DictionaryContract.WordEntry.TABLE_NAME, null, null, null, null, null, null);
DatabaseUtils.dumpCursor(cursor);

т.е. выделите все строки, и они запишут все строки в Курсоре в Журнал.

Если все еще нет, то таблицы на других устройствах пусты.Если возникает исключение, вам придется исследовать это.

Если это работает как ожидалось, то постепенно (по одному) добавьте критерии выбора и аргументы.

например, первым будет

 String selection = "eng LIKE ?";
    String[] selectionArgs = {term};
    String orderBy = "eng, oky ASC";
    Cursor cursor = db.query(DictionaryContract.WordEntry.TABLE_NAME, null, selection, selectionArgs, null, null, null);

затем: -

String selection = "eng LIKE ? OR oky LIKE ?";
String[] selectionArgs = {term, term};
String orderBy = "eng, oky ASC";
Cursor cursor = db.query(DictionaryContract.WordEntry.TABLE_NAME, null, selection, selectionArgs, null, null,null);

и т. Д. (Обратите внимание, наконец, добавьте порядок еще раз).

Если ничего из вышеперечисленного не работает, то ваша проблема (как и ожидалось) в другом месте.

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