Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLite. Метод rawQuery.

Обсуждение уроков
aleksbim
Сообщения: 81
Зарегистрирован: 02 фев 2013, 02:52

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение aleksbim » 31 июл 2013, 17:01

И все же, выше было сказано, что PS и PL -это псевдонимы для уменьшения кол-ва букв. Не напишете ли эти строки без псевдонимов?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение Foenix » 31 июл 2013, 17:07

глупо делать псевдонимы для уменьшения количества букв. Это делается с другой целью. В данном случае, приведенном тобой - эти псевдонимы вообще не нужны. Убери их и все.
Псевдонимы могут понадобиться, когда например, выбираем sum(salary) as summa для того, чтобы иметь возможность доступа к получившемуся столбцу значений в программе по имени. Или когда селект сложный, выборка происходит из другой выборки, и нужно в этом же селекте обратиться к результатам внутреннего селекта.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение Foenix » 31 июл 2013, 17:11

aleksbim писал(а): "select people.name , position.name , position.salary "
+ "from people "
+ "inner join position "
+ "on people.posid = position.id "
+ "where salary > ?";
Примерно так будет без псевдонимов. для отличия в одном месте можно дописать position.name as ... (как угодно) чтобы не было дубликата наименования в результате.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение Foenix » 01 авг 2013, 18:31

забыла дописать
вот тут например position.salary можно не указывать наименовани таблицы, т.к. поле salary есть только в ней, поэтому если удалить и оставить просто salary тоже будет работать.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

murray
Сообщения: 2
Зарегистрирован: 20 авг 2013, 17:51

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение murray » 20 авг 2013, 18:03

Код: Выделить всё

c = db.query("people, position", new String[] {"people.id", "position.name","position.id","position.salary"}, "people.posid = position.id", null, null, null, null);

Код: Выделить всё

id = 2; name = Программер; id = 2; salary = 13000; 
id = 3; name = Бухгалтер; id = 3; salary = 10000; 
id = 2; name = Программер; id = 2; salary = 13000; 
id = 2; name = Программер; id = 2; salary = 13000; 
При выводе запроса вместо столбца people.id выводится position.id. То есть если столбцы в разных таблицах имеют одинаковое имя, то они выводятся некорректно.
Стоит написать "position.id as qw". Где qw-произвольное имя. Тогда вывод корректен.

Код: Выделить всё

id = 1; name = Программер; qw = 2; salary = 13000; 
id = 2; name = Бухгалтер; qw = 3; salary = 10000; 
id = 3; name = Программер; qw = 2; salary = 13000; 
id = 4; name = Программер; qw = 2; salary = 13000; 

Аватара пользователя
plesser
Сообщения: 25
Зарегистрирован: 10 ноя 2013, 14:05
Откуда: Жуковский

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение plesser » 18 дек 2013, 09:17

Что использовать rawQuery или query – решать вам и зависит от ситуации. Хотя, навскидку я не могу придумать
преимущества одного над другим в той или иной ситуации. Но наверно они есть.
Дошел до 37 урока и встретил этот абзац.
На самом деле у rawQuery есть то преимущество что я могу квотировать параметры не только в части where но и в других, например в select но и having


Да и вообще практика использовать конструкции типа "where somefield="+somevar мягко говоря не очень хорошая

Вообщем как то так
При наличии доступа к Google - бесподобен.

TittTitov
Сообщения: 27
Зарегистрирован: 20 ноя 2013, 22:46

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение TittTitov » 16 янв 2014, 21:12

Добрый день!

Объясните пожалуйста: в данном уроке метод logCursor(c); - это какой-то специальный метод или это частная запись для сокращения кода?

Также, интересует эта строка: for (String cn : c.getColumnNames()) { - что означает двоеточие?

И ещё, по каким правилам используются квадратные скобки при объявлении массивов: String columns[] и String[] selectionArgs - почему в одном случае кавычки после String, а во втором - после имени объекта? Спасибо! ...и не пинайте сильно, если что :)

TittTitov
Сообщения: 27
Зарегистрирован: 20 ноя 2013, 22:46

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение TittTitov » 16 янв 2014, 21:19

P.S.: разъясните пожалуйста, также, зачем мы пишем cv.clear(); перед заполнением таблиц в данном примере? Спасибо!

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение Foenix » 16 янв 2014, 22:17

TittTitov писал(а):Добрый день!

Объясните пожалуйста: в данном уроке метод logCursor(c); - это какой-то специальный метод или это частная запись для сокращения кода?

Также, интересует эта строка: for (String cn : c.getColumnNames()) { - что означает двоеточие?

И ещё, по каким правилам используются квадратные скобки при объявлении массивов: String columns[] и String[] selectionArgs - почему в одном случае кавычки после String, а во втором - после имени объекта? Спасибо! ...и не пинайте сильно, если что :)
logCursor() - это вызов самостоятельно написанного метода из кода:

Код: Выделить всё

 void logCursor(Cursor c) {
    if (c != null) {
      if (c.moveToFirst()) {
        String str;
        do {
          str = "";
          for (String cn : c.getColumnNames()) {
            str = str.concat(cn + " = " + c.getString(c.getColumnIndex(cn)) + "; ");
          }
          Log.d(LOG_TAG, str);
        } while (c.moveToNext());
      }
    } else
      Log.d(LOG_TAG, "Cursor is null");
  }
двоеточие означает "в", т.е. для каждого... во множестве...
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение Foenix » 16 янв 2014, 22:18

не кавычки, а квадратные скобки, обозначают безмерный массив типа то, что (перед скобками)
например
int[] position_id = { 1, 2, 3, 4 };
это объявлена переменная position_id типа массив целых.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение Foenix » 16 янв 2014, 22:21

а это
String columns[] = { "PL.name as Name", "PS.name as Position", "salary as Salary" };
объявлено множество из строковых значений.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение Foenix » 17 янв 2014, 00:02

TittTitov писал(а):P.S.: разъясните пожалуйста, также, зачем мы пишем cv.clear(); перед заполнением таблиц в данном примере? Спасибо!
это мы так на всякий случай стираем все, возможно имеющиеся, пары значений в переменной о которой я вам писала в предыдущем вопросе (типа ContentValues )
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

September
Сообщения: 5
Зарегистрирован: 07 фев 2014, 19:02

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение September » 07 фев 2014, 19:12

Собственно возникла проблема с запросом в rowQuery

Вот запрос который скопипащен(он прекрасно работает в программе)

[syntax=java]"select PL.name as Name, PS.name as Position, salary as Salary "
+ "from people as PL "
+ "inner join position as PS "
+ "on PL.posid = PS.id "
+ "where salary > ?";[/syntax]

А вот запрос который писался в ручную и выдает ошибку
[syntax=java]"SELECT PL.name as Name, PS.name as Position, salary as Salary "
+ "from people as PL "
+ "inner join position sa PS "
+ "on PL.posid = PS.id "
+ "where salary > ?";[/syntax]

Собственно не вижу ризницы и хочу разобраться где допустил ошибку я.

Сам код ошибки
Изображение

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение Foenix » 07 фев 2014, 21:16

там надо as а у тебя sa
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

September
Сообщения: 5
Зарегистрирован: 07 фев 2014, 19:02

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение September » 07 фев 2014, 23:09

И ведь раз десять пересматривал и не заметил, спасибо за помощь.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение Foenix » 07 фев 2014, 23:24

вообще-то это в логе написано, красным по белому
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

TAMEPJlAH
Сообщения: 4
Зарегистрирован: 28 окт 2013, 11:39

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение TAMEPJlAH » 04 апр 2014, 09:42

Здравствуйте. Имеется три активити (MainActivity (основная), Program (программы подготовки) и Speciality (специальности)), база данных (myDB), которая содержит 3 таблицы (связанные по ID) и которая создана в MainActivity. Как сделать чтобы при нажатии на кнопку, расположенную в активити Program считывались данные из БД? Желательно с помощью Intent
P.S. может быть не в той теме написал, поэтому сразу извиняюсь за это

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение Foenix » 04 апр 2014, 11:10

Код: Выделить всё

Желательно с помощью Intent
c с помощью какого-такого Intent?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

TAMEPJlAH
Сообщения: 4
Зарегистрирован: 28 окт 2013, 11:39

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение TAMEPJlAH » 07 апр 2014, 08:59

Foenix писал(а):c с помощью какого-такого Intent?
по уроку 28

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 37. Запросы из связанных таблиц. INNER JOIN в SQLit

Сообщение Foenix » 07 апр 2014, 10:30

Данный урок не относится к теме, а так же никак не относится к
считывались данные из БД?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ответить