Возможно ли как-то работать с курсором внутри другого?

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Закрыто
Аватара пользователя
Коваленко Павел
Сообщения: 14
Зарегистрирован: 19 апр 2015, 16:35

Возможно ли как-то работать с курсором внутри другого?

Сообщение Коваленко Павел » 11 май 2015, 13:51

Моя БД состоит из двух таблиц. В процесе постройки List'a мне нужно взять имя из первой и n-ое количество номеров связаных с этим именем из второй.

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

if (cMyNewPeople !=null && cMyNewPeople.getCount()>0) {
        cMyNewPeople.moveToFirst();
        do {

            nc.moveToFirst();
            do {
               numbers = nc.getString(0) + ": " + nc.getString(1) + "\n";
            } while (nc.moveToNext());
            Log.d("RingApp", "numbers = " + numbers);
            list.add(new ContactItem(cMyNewPeople.getInt(0), cMyNewPeople.getString(1), "", numbers));
            numbers = "";
        } while (cMyNewPeople.moveToNext());
    }

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

Re: Возможно ли как-то работать с курсором внутри другого?

Сообщение Foenix » 11 май 2015, 16:06

все это вкорне неверно, так делать нельзя, нужно делать запрос в бд, объединяющий таблицы, для этого придуман язык sql. В java обработка двух курсоров занимает много ресурсов/времени.
R.id.team

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

Аватара пользователя
Коваленко Павел
Сообщения: 14
Зарегистрирован: 19 апр 2015, 16:35

Re: Возможно ли как-то работать с курсором внутри другого?

Сообщение Коваленко Павел » 11 май 2015, 18:06

Foenix писал(а):все это вкорне неверно, так делать нельзя, нужно делать запрос в бд, объединяющий таблицы, для этого придуман язык sql. В java обработка двух курсоров занимает много ресурсов/времени.
я вас понял, но не могли бы вы мне подсказать, как быть в этой ситуации. Мне нужно, что бы из первой таблицы вернулась всего одна строка, а из второй массив строк связанный с ней по id. :?

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

Re: Возможно ли как-то работать с курсором внутри другого?

Сообщение Foenix » 11 май 2015, 18:17

на пальцах показать? вам к экстрасенсу.
структура таблиц, пример данных, пример того,что хотите получить.
R.id.team

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

Аватара пользователя
Коваленко Павел
Сообщения: 14
Зарегистрирован: 19 апр 2015, 16:35

Re: Возможно ли как-то работать с курсором внутри другого?

Сообщение Коваленко Павел » 11 май 2015, 18:52

Foenix писал(а):на пальцах показать? вам к экстрасенсу.
структура таблиц, пример данных, пример того,что хотите получить.
вот структуры таблиц
Изображение
заполнена id и именами
1 катя
2 маша
3 саша
Изображение
1 1 (номер кати) (тип номера, мобильный)
2 1 (еще один номер кати) (тип номер, домашний)
3 2 (номер маши) (тип номера, рабочий)
4 3 (номер саши) (тип номера, мобильный)

В итоге нужно построить список из имен и номеров, к этим именам относящисмся.

например: маша рабочий 222-33-44
мобильный 333-44-55
домашний 444-55-66
Вложения
table1.png
table1.png (5.33 КБ) 13522 просмотра

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

Re: Возможно ли как-то работать с курсором внутри другого?

Сообщение Foenix » 11 май 2015, 19:07

select name, number, type from Cell left outer join People on People.id=Cell.people_id order by name, type, number
\
Замечу, что лучше назвать поля не id, а _id и добавить в запрос это поле с таблицы Cell
R.id.team

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

Аватара пользователя
Коваленко Павел
Сообщения: 14
Зарегистрирован: 19 апр 2015, 16:35

Re: Возможно ли как-то работать с курсором внутри другого?

Сообщение Коваленко Павел » 11 май 2015, 19:24

Foenix писал(а):select name, number, type from Cell left outer join People on People.id=Cell.people_id order by name, type, number
\
Замечу, что лучше назвать поля не id, а _id и добавить в запрос это поле с таблицы Cell
ваш запрос возвращает: имя, номер и тип номера.

т.е. в итоге мы видим: катя мобильный 111-22-33
____________________катя домашний 222-33-44
____________________катя рабочий 333-44-55
Изображение
Изображение
Изображение
а хотелось бы:
КАТЯ: мобильный 111-22-33
____________ домашний 222-33-44
____________ рабочий 333-44-55

Изображение

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

Re: Возможно ли как-то работать с курсором внутри другого?

Сообщение Foenix » 11 май 2015, 19:52

А это придется делать в адаптере, это как раз очень легко - просто скрывать вьюшку, проверив - какое значение было перед этим. Если то же самое - то View.INVISIBLE, если другое - то визибл
И это уже не относилось к первоначальному вопросу.
R.id.team

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

Аватара пользователя
Коваленко Павел
Сообщения: 14
Зарегистрирован: 19 апр 2015, 16:35

Re: Возможно ли как-то работать с курсором внутри другого?

Сообщение Коваленко Павел » 11 май 2015, 20:13

Foenix писал(а):А это придется делать в адаптере, это как раз очень легко - просто скрывать вьюшку, проверив - какое значение было перед этим. Если то же самое - то View.INVISIBLE, если другое - то визибл
И это уже не относилось к первоначальному вопросу.
Да, я знаю, про свойство view.invisible, но, похоже, мы опять с вами не поняли друг друга. мой item.xml из которого я строю list состоит из двух TextView. в одном лежит имя в другом список контактных номеров. т.е скрыть возможно дублирующиеся имена и тогда будет виден лишь один контактный номер человека. возможно я не правильно сформулировал мой первоначальный вопрос, примите мои извинения. я предполагал, что в моем случае мне нужно две строки - одна, содержащая имя, вторая с списком телефонов через "\n".

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

Re: Возможно ли как-то работать с курсором внутри другого?

Сообщение Foenix » 11 май 2015, 21:33

я все равно не поняла из этих объяснений ничего.
В одном имя , в другом номера - в чем проблема сделать имя невидимым?
R.id.team

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

Аватара пользователя
Коваленко Павел
Сообщения: 14
Зарегистрирован: 19 апр 2015, 16:35

Re: Возможно ли как-то работать с курсором внутри другого?

Сообщение Коваленко Павел » 11 май 2015, 22:17

Foenix писал(а):я все равно не поняла из этих объяснений ничего.
В одном имя , в другом номера - в чем проблема сделать имя невидимым?
Строим список контактов с помощью ListView. в ListView помещается элемент item.xml. в нём у нас 2 TextView. один для отображения имени. второй для отображения контактных номеров. используя inner join на выходе получаем такую картинку
Изображение

Если же скрыть имена, которые дублируются, то выходит, что у нас каждому человеку соответствует лишь один номер:

Изображение

а хотелось бы получить вот такой результат:

Изображение

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

Re: Возможно ли как-то работать с курсором внутри другого?

Сообщение Foenix » 11 май 2015, 23:19

я сказала все правильно.
Как же ты на втором рисунке скрыл имена, если они повторяются? смешно даже.
Надо скрыть 1 текствью ( утебя показан красным), с именем, получится то что нужно. Зачем все скрывать-то?
R.id.team

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

Аватара пользователя
Коваленко Павел
Сообщения: 14
Зарегистрирован: 19 апр 2015, 16:35

Re: Возможно ли как-то работать с курсором внутри другого?

Сообщение Коваленко Павел » 12 май 2015, 00:36

Foenix писал(а):я сказала все правильно.
Как же ты на втором рисунке скрыл имена, если они повторяются? смешно даже.
Надо скрыть 1 текствью ( утебя показан красным), с именем, получится то что нужно. Зачем все скрывать-то?
Вот что тогда получится.
Изображение

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

Re: Возможно ли как-то работать с курсором внутри другого?

Сообщение Foenix » 12 май 2015, 00:45

все правильно. Тебе остается правильно организовать вьюшку. Что именно не понятно?
Используй не INVISIBLE, а GONE и в дополнении программируй свои траурные рамочки как тебе надо.
R.id.team

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

Аватара пользователя
Коваленко Павел
Сообщения: 14
Зарегистрирован: 19 апр 2015, 16:35

Re: Возможно ли как-то работать с курсором внутри другого?

Сообщение Коваленко Павел » 12 май 2015, 08:32

Foenix писал(а):все правильно. Тебе остается правильно организовать вьюшку. Что именно не понятно?
Используй не INVISIBLE, а GONE и в дополнении программируй свои траурные рамочки как тебе надо.
я не понимаю, что это даст? я скрываю имена при повторении, и тогда первый номер идет под именем, а остальные без но в РАЗНЫХ элементах списка...
можешь накодить простенький пример реализации?

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

Re: Возможно ли как-то работать с курсором внутри другого?

Сообщение Foenix » 12 май 2015, 11:08

все так как я сказала. Да, в разных элементах списка. Тебе для чего это надо-то? Начнем с этого.
Возможен еще запрос, более сложный, где номера могут быть в одной ячейке курсора строкой любого формата. Но так часто выводят лишь справочную информацию, которую потом никак обрабатывать не будут.
Изображение
R.id.team

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

Аватара пользователя
Коваленко Павел
Сообщения: 14
Зарегистрирован: 19 апр 2015, 16:35

Re: Возможно ли как-то работать с курсором внутри другого?

Сообщение Коваленко Павел » 12 май 2015, 12:04

Я хочу написать приложение, которое будет отображать список контактов. Для этого я тяну данные из ContactsContract.

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

 Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                null, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);

В цикле я получаю данные в виде пар: имя, номер. Имена контактов повторяются, при этом номера, которые соответсвуют имени, идут на выход по очереди. Т.е. если у меня в ContactsContract есть условная Катя, за которой значится несколько номеров, то на выходе я получу: Катя - мобильный номер, Катя - домашний номер, Катя - рабочий номер. Я хочу сгрупировать эти номера и вывести в свой ListView в виде одной ячейки списка. Например, Будет ячейка с первым TextView "Катя" и вторым, который будет содержать ее номера. Ваш предложеный вариант: поместить в первый элемент списка имя контакта с одним из номеров, а остальные положить в следующие мне не подходит т.к., я хочу в дальнейшем выполнять по нажатию на элемент списка некие действия, например, повесить на ячейку контекстное меню с возможностью выбора номера и осуществлению звонка на оный.

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

Re: Возможно ли как-то работать с курсором внутри другого?

Сообщение Foenix » 12 май 2015, 12:35

тебе отвечать - потеря времени. Спросил за одно, продолжил за другое, теперь третье.
Запрос контактов - это совсем не те таблички, что ты представил ранее. ЭТо раз.
И объединять в одну ячейку телефоны, чтобы потом делать контекстное меню (которое уже устарело к слову) really?
R.id.team

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


Закрыто