Замена комнатного курсора DAO - PullRequest
0 голосов
/ 02 июня 2018

В настоящее время я занимаюсь рефакторингом старого проекта и решил использовать Room DAO.Этот проект использует Курсор для отображения длинного списка объектов.Ok Room DAO имеет возможность вернуть Курсор.

@Query("SELECT * FROM user")
public Cursor loadUsers();

Но официальная документация не рекомендует нам его использовать

Внимание: крайне не рекомендуется работать с API-интерфейсом Cursor, потому что он не гарантирует, существуют ли строки или чтозначения строки содержат.Используйте эту функциональность, только если у вас уже есть код, который ожидает курсор и который вы не можете легко изменить.

Документация предлагает сделать таким образом

@Query("SELECT * FROM user")
public List<User> loadUsers();

Мои опасениячто это на самом деле будет получать все данные из таблицы и хранить их в памяти (я что-то пропустил?).В отличие от курсора содержит только кучу данных (окно) и выбирает новую порцию по требованию.

Итак, вопрос в том, как выполнять запросы к большой базе данных с использованием Room DAO, сохраняя низкое потребление памяти?

1 Ответ

0 голосов
/ 02 июня 2018

ИМХО, если у вас большой запрос к базе данных, для которого вы полагаетесь на окна курсора, вам следует переосмыслить свой интерфейс.Пользователи не хотят, например, пролистывать тысячи строк в списке.

Однако решение компонентов архитектуры для вашей проблемы - Библиотека подкачки .Вы можете сделать так, чтобы ваш DAO возвращал DataSource.Factory вместо Cursor или List, и вы можете использовать DataSource.Factory для доставки страниц в ваш пользовательский интерфейс (например, RecyclerView) по мере необходимости.

...