Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Затем вы можете использовать ExpandableListView, чтобы отобразить основной элемент и все дочерние элементы внизу, чтобы указать "один- многие" отношения в хорошем смысле. Конечно, вам нужно правильно написать свой адаптер, чтобы справиться с этим делом.

Ответ 2

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

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

Ответ 3

Если вы хотите получить агрегированные данные из дочерней таблицы, вы должны использовать "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