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