Как извлечь данные из дочерней таблицы с помощью CursorLoader, который загружает данные из основной таблицы? - PullRequest
12 голосов
/ 28 сентября 2011

Мое приложение использует CursorLoader для загрузки данных из основной таблицы.Данные будут отображаться в ListView с помощью CursorAdapter.Представление, отображаемое в ListView, также требует данных из дочерней таблицы.Соотношение таблиц одно-ко-многим.

  • Если я соединю обе таблицы во время запроса, объединенные записи будут такими же, как и дочерние записи, таким образом, в ListView,в основной таблице будет отображаться несколько элементов для одной записи.

  • Если я не присоединюсь к таблице, я не уверен, каков наилучший способ получения дочерних записей после CursorLoader доставил данные через курсор.Кто-нибудь сможет мне помочь?

Ответы [ 3 ]

1 голос
/ 11 июля 2012

Если данные дочерней таблицы не нужно запрашивать отдельно, вы можете поместить эти данные в основную таблицу, используя что-то вроде нотации JSON, а затем проанализировать их внутри метода bindView для CursorAdapter. Это может иметь проблемы с производительностью в зависимости от сложности данных в дочерней таблице. Но это позволит вам использовать один курсор.

Другой подход, который вы можете использовать, - создать объект DAO, который запускает необработанный запрос как объединение (чтобы вы получили несколько строк), а затем обрабатывает его курсор в List, где Foo представляет собой POJO, представляющий данные. (или выполнить n + 1 запрос - основной запрос, а затем подзапрос для каждой строки). Затем создайте Loader, который вызывает DAO для возврата List и использует ListAdapter из этого. Ваш пользовательский загрузчик может по-прежнему регистрироваться для уведомлений об изменении данных и выполнять перезагрузку. Я использовал CursorLoader в качестве шаблона для создания своих собственных загрузчиков, которые перезагружаются, когда я не хочу связываться с курсором в ListView, и он работает хорошо.

0 голосов
/ 18 июля 2012

Если вы хотите получить агрегированные данные из дочерней таблицы, вы должны использовать 'group by' в операторах sql. Например, две таблицы:

parent(id,name)
child(id,parentId,age)

Для запроса всех родителей со старшим ребенком:

select a.id,a.name,max(b.age)
from parent as a inner join child as b on a.id=b.parentId
group by a.id,a.name
0 голосов
/ 15 июля 2012

Вы должны попробовать опцию соединения и установить свой порядок сортировки для вашего запроса, чтобы убедиться, что результаты отсортированы по результатам в основной таблице.

После этого вы можете использовать ExpandableListView , чтобы показать основной элемент и все дочерние элементы, расположенные внизу, для хорошего отображения отношения «один ко многим». Конечно, вы должны написать свой адаптер соответствующим образом, чтобы справиться с этим делом.

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