Урок 36. SQLite. Подробнее про метод query. Условие, сортировка, группировка
Урок 36. SQLite. Подробнее про метод query. Условие, сортировка, группировка
В этом уроке:
- подробно разбираем метод чтения данных query
- используем сортировку, группировку, условия, having
Click here to read this article!
- подробно разбираем метод чтения данных query
- используем сортировку, группировку, условия, having
Click here to read this article!
Последний раз редактировалось damager82 01 май 2017, 16:40, всего редактировалось 11 раз.
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Вопрос по организации кода.
Зачем получать курсор в каждом кейсе. Ведь переменные то мы и так установили все в null. Можно же один раз курсор получить после switch. Или же для этого были другие причины???
Зачем получать курсор в каждом кейсе. Ведь переменные то мы и так установили все в null. Можно же один раз курсор получить после switch. Или же для этого были другие причины???
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Только для большей наглядности. Чтоб читатель четко видел какие параметры в методе используются для каждого случая.ermek6 писал(а):Зачем получать курсор в каждом кейсе.
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Здравствуйте.
Огромное спасибо за уроки.
Объясните, пожалуйста, эту конструкцию:
for (String cn : c.getColumnNames())
Огромное спасибо за уроки.
Объясните, пожалуйста, эту конструкцию:
for (String cn : c.getColumnNames())
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Еще вопрос.
Есть такой код:
btnAll = (Button) findViewById(R.id.btnAll);
btnAll.setOnClickListener(this);
я его пишу так:
((Button) findViewById(R.id.btnAll)).setOnClickListener(this);
Когда мы эмулируем нажатие кнопки то первый вариант отлично работает а второй нет, выбрасывается исключение: java.lang.NullPointerException
Но при клике второй вариант тоже отлично работает.
Кто сможет объяснить почему так?
Есть такой код:
btnAll = (Button) findViewById(R.id.btnAll);
btnAll.setOnClickListener(this);
я его пишу так:
((Button) findViewById(R.id.btnAll)).setOnClickListener(this);
Когда мы эмулируем нажатие кнопки то первый вариант отлично работает а второй нет, выбрасывается исключение: java.lang.NullPointerException
Но при клике второй вариант тоже отлично работает.
Кто сможет объяснить почему так?
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
1. for (String cn : c.getColumnNames()) - это аналог foreach в C#. В java решили не вводить новое ключевое слово. Можно перебирать содержимое коллеции или массива.
2. ((Button) findViewById(R.id.btnAll)).setOnClickListener(this); можно упростить до findViewById(R.id.btnAll).setOnClickListener(this); - клик можно ставить на любой View, а не только на кнопки.
java.lang.NullPointerException может появиться в первоначальном варианте, если будет найдена не кнопка, в упрощёном - если ничего не найдено.
2. ((Button) findViewById(R.id.btnAll)).setOnClickListener(this); можно упростить до findViewById(R.id.btnAll).setOnClickListener(this); - клик можно ставить на любой View, а не только на кнопки.
java.lang.NullPointerException может появиться в первоначальном варианте, если будет найдена не кнопка, в упрощёном - если ничего не найдено.
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Большое спасибо.math64 писал(а):это аналог foreach в C#
Тем не менее 2 вопрос остается открытым.
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Т.е. ты хочешь упростить
из примера?
упрощается так:
Объявление поля Button btnAll; из класса удаляется, как и остальных кнопок (для которых даже локальных переменных не нужно выделять) - эти поля нигде не используются.
Однако, если к кнопке нужно обращение из других методов, лучше найти её и запомнить в поле класса в метода onCreate - чтобы больше не искать.
Код: Выделить всё
btnAll = (Button) findViewById(R.id.btnAll);
btnAll.setOnClickListener(this);
...
onClick(btnAll);
упрощается так:
Код: Выделить всё
View btnAll = findViewById(R.id.btnAll);
btnAll.setOnClickListener(this);
...
onClick(btnAll);
Однако, если к кнопке нужно обращение из других методов, лучше найти её и запомнить в поле класса в метода onCreate - чтобы больше не искать.
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
java.lang.NullPointerException выскакивает из-за того что операция выполняется справа на лево, вот переменной сначала нету а ты уже вешаешь обработчик, вот оно и нулл выкидывает... если я не ошибаюсь, а то с утра могу и натупить =)
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
rezak - нет, из-за того что убрали инициализацию поля класса btnAll, а затем используют неинициализируемую в onClick(btnAll). Поле класса нужно убрать, заменить на локальную переменную - тогда компилятор выдаст предупреждение. Поле класса по умолчанию иницализируется в null, а локальная переменная должна инициализироваться программистом.
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Вот спасибо! Теперь ясно.math64 писал(а):rezak - нет, из-за того что убрали инициализацию поля класса btnAll, а затем используют неинициализируемую в onClick(btnAll). Поле класса нужно убрать, заменить на локальную переменную - тогда компилятор выдаст предупреждение. Поле класса по умолчанию иницализируется в null, а локальная переменная должна инициализироваться программистом.
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
do {
str = "";
for (String cn : c.getColumnNames()) {
str = str.concat(cn + " = "
+ c.getString(c.getColumnIndex(cn)) + "; ");
}
Log.d(LOG_TAG, str);
} while (c.moveToNext());
Не могли бы вы подробней описать этот код.
for (String cn : c.getColumnNames()) как работает этот цикл? что означает двоеточие тут?
str.concat что делает эта функция?
str = "";
for (String cn : c.getColumnNames()) {
str = str.concat(cn + " = "
+ c.getString(c.getColumnIndex(cn)) + "; ");
}
Log.d(LOG_TAG, str);
} while (c.moveToNext());
Не могли бы вы подробней описать этот код.
for (String cn : c.getColumnNames()) как работает этот цикл? что означает двоеточие тут?
str.concat что делает эта функция?
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Я уже обяснял выше в этой теме: for( v : collection) - это соответвует foreach в C#. ; двоеточие соответствует in. Перебирается содержимое коллекции.
concat() - конкатенация, вместо неё можно использовать + (точнее, все вызовы + для строк заменяются на вызов concat() ).
concat() - конкатенация, вместо неё можно использовать + (точнее, все вызовы + для строк заменяются на вызов concat() ).
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
видно по форуму просто не все знакомы не то что с явой а и с шарпом =) ... так что трудно конечно им и возникают такие вот вопросы.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Добрый день. Подскажите как можно в качестве сравниваемого значение передать массив например region = {"Америка", "Азия"}. Именно список.
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
куда передать? я так понял хотите сравнить значения в массиве со значениями в бд?zavbak писал(а):Добрый день. Подскажите как можно в качестве сравниваемого значение передать массив например region = {"Америка", "Азия"}. Именно список.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
WHERE region IN ( 'Америка', 'Азия')zavbak писал(а):Добрый день. Подскажите как можно в качестве сравниваемого значение передать массив например region = {"Америка", "Азия"}. Именно список.
или создать таблицу Continents - тогда
WHERE region = Continents.name
http://www.sqlite.org/lang_expr.html
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
math64 писал(а):WHERE region IN ( 'Америка', 'Азия')zavbak писал(а):Добрый день. Подскажите как можно в качестве сравниваемого значение передать массив например region = {"Америка", "Азия"}. Именно список.
или создать таблицу Continents - тогда
WHERE region = Continents.name
http://www.sqlite.org/lang_expr.html
А массив в качестве параметра передать нельзя?
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Нет, конечно. Параметр заменяет число или строку в SQL запросе. Если передадите массив, вызовется, полягаю, метод toString(), т.е. параметр будет заменён на хеш-код массива. А в SQL в Вашем случае нужно применть IN или JOIN со вспомогательной таблицей, которой будут записи 'Америка' и 'Азия':zavbak писал(а):А массив в качестве параметра передать нельзя?
Вот полные SQL:
Код: Выделить всё
SELECT field1, field2, region FROM table1 WHERE region IN ('Америка', 'Азия')
SELECT t.field1, t.field2, t.region FROM table1 AS t JOIN continents AS c ON t.region = c.name
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор
Второй вариант будет хорошь если записи уже имеются в базе. А если даже таблици такой нет или есть но нужны только те которые выбрал пользователь?
А первый вариант так и просит сделать ему SQL инъекцию
Я вот подумал, может такой вариант сойдет?Работоспособность не проверял, вроде должно работать.
А первый вариант так и просит сделать ему SQL инъекцию
Я вот подумал, может такой вариант сойдет?
Код: Выделить всё
String paramString ="?";
for(i = 2; i < paramArray.size() - 1; i++)
paramString = paramString + ",?";
String sqlString ="SELECT * FROM table WHERE region IN (" + paramString + ")";
Cursor cursor = db.rawQuery (sqlString, paramArray)
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.