Я пишу приложение для 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?