Android SQLite rawquery не работает для запроса, который работает в командной строке sqlite3 & dbeaver - PullRequest
0 голосов
/ 01 октября 2019

Я пишу приложение для Android для кондо-комплекса, чтобы помочь в поиске коммунальных услуг для жителей. У меня есть несколько таблиц, и у меня возникают проблемы с получением данных из 1 из них, но только для 1 запроса из 3. Обратите внимание, что я использую SQLiteDatabase.rawquery. Также запрос работает в командной строке sqlite3 и dbeaver. При первом использовании приложения в столбце «ваши» должны быть все 0 (логическое значение «ложь»), а затем пользователь должен установить для них значение 1 (true). Итак, первый вызов не должен возвращать строк. Позже вызывается 1 строка.

Таблица определена следующим образом:

CREATE TABLE units (
building int4 NOT NULL,
unit int4 NULL,
stack int4 NULL,
unit_id int4 NOT NULL,
stack_id int4 NOT NULL,
yours int4 NULL,
CONSTRAINT units_pk PRIMARY KEY (unit_id));

Запрос, который не выполняется в Android, но работает в командной строке и dbeaver, выглядит следующим образом. Я скопировал версию без аргументов прямо в командную строку, и она работает, кроме добавления точки с запятой. Вариант args также не работал.

String query = "SELECT * FROM units WHERE yours = 1";
    //String query = "SELECT * FROM units WHERE yours = ?";
    //String[] args = new String[]{"1"};
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = null;
    try {
        cursor = db.rawQuery(query, null);
        //cursor = db.rawQuery(query, args);

Следующие 2 запроса работают, один с подстановочным знаком (*).

        List<String> units = new ArrayList<>();
    String query = "SELECT unit FROM units WHERE building = " + buildingSelected
                   + " ORDER BY unit";
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor;
    try {
        cursor = db.rawQuery(query, null);

cursor = db.rawQuery("SELECT * FROM units ORDER BY unit_id", null);

Я в растерянности относительно того, чтонеправильно и не могу найти ответ в Интернете на основе моих вопросов.

10/2/2019 Добавлено следующее, чтобы объяснить «не работает».

Из командной строки sqlite3 запустилОператор SQL, чтобы выбрать все строки, где ваш = 1. Ни одна строка не возвращается так, как ожидалось, поскольку все строки имеют ваш = 0 (false). Затем обновите 1 строку, чтобы установить для себя значение 1. Запустите тот же оператор SQL и получите 1 строку, как и ожидалось.

SQLite version 3.28.0 2019-04-16 19:49:53
Enter ".help" for usage hints.
sqlite> .tables
electric_meters  gas_meters       units            water_valves
sqlite> SELECT * FROM units WHERE yours = 1;
sqlite>
sqlite> UPDATE units SET yours = 1 WHERE unit_id = 4561205;
sqlite> SELECT * FROM units WHERE yours = 1;
4561|205|5|4561205|45615|1
sqlite>

Снова запустите UPDATE, чтобы вернуть строку к вашему = 0 для запуска приложения в студии. Обновленный код после вызова rawQuery для getCount () в переменных строках.

cursor = db.rawQuery(query, null);
        //cursor = db.rawQuery(query, args);

        int rows = cursor.getCount();

И пока я собирал эту информацию, я обнаружил ошибку кода, которая вызывала проблемы с выходными данными отладки. В то время как данные выглядят корректными в правильных форматах, я не ожидаю, что строки будут возвращены, но 2 возвращенные строки имеют yours = 1. Обратите внимание, что ошибка кода произошла после вызова rawQuery и во время извлечения значений в курсоре в класс Unit. пример.

Это, вероятно, плохая форма, чтобы изменить мой вопрос в середине. База данных, которую я просматриваю через командную строку sqlite3, находится в каталоге ресурсов проекта. Приложение использует тот, который находится на AVD в / data / user / 0 / .... Они могут отличаться. Я сделал чистый проект несколько раз. Я думал, что это сбросит все, включая обновление базы данных, которую приложение использует в AVD. Может кто-нибудь сказать мне, как сделать так, чтобы база данных проекта пополнилась структурой данных AVD?

1 Ответ

0 голосов
/ 03 октября 2019

Я нашел решение своей проблемы. Оказывается, база данных в файловой структуре AVD не обновлялась, когда я думал, что это будет: очистить проект, синхронизировать файлы и т. Д. База данных AVD имела значения для вашего = 1, поэтому она отвечала правильно. Закончилось удаление баз данных, а затем загрузка из папки проекта ресурсов. Наверное, лучше, но я не смог его найти. Спасибо.

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