Данные SQLite в RecyclerView

Приложение имеет данные в базе данных SQLite. Пользовательский интерфейс — это прежде всего RecyclerView. Вопрос в том, как лучше всего передавать данные из базы данных в пользовательский интерфейс, не отвлекаясь от основного потока?

Изначально я планировал использовать CursorLoader, ContentProvider и RecyclerView. Но читая об этом, похоже, что RecyclerView не имеет готовой поддержки данных, предоставленных Cursor. Данг.

Это оставляет мне несколько других вариантов...

  1. AsyncTask для загрузки данных, помещения их в объекты модели и передачи в адаптер RecyclerView. Помимо того, что он уродлив, он не подходит для изменения конфигурации.

  2. Пользовательский загрузчик, который загружает данные из SQL и помещает их в объекты модели.

  3. Используйте загрузчик Cursor, и когда он возвращает Cursor, выполните итерацию по нему, чтобы поместить данные в объекты модели. Я подозреваю, что это произойдет в основном потоке и может снизить производительность.

  4. Используйте Otto, чтобы отправить сообщение запроса для запроса данных, а затем вернуть коллекцию объектов модели в ответном сообщении. Может быть ~ 500 объектов, поэтому я думаю, что могу злоупотреблять этим Отто.

Если я использую коллекцию объектов модели вместо Cursor, я вижу меньше преимуществ для ContentProvider, и я также теряю возможность автоматического обновления пользовательского интерфейса при изменении данных (что может быть полезно).

Ни один из этих вариантов не нравится, есть ли лучший способ? Приложение находится в цейтноте, поэтому что бы оно ни было, оно должно быть реализовано довольно быстро. К сожалению, пользовательский интерфейс должен прокручиваться по горизонтали и предназначен только для Lollipop, поэтому RecyclerView кажется лучшим выбором, чем ListView.


comment
Я использую метод 3 в одном из своих приложений, а в onLoadFinished я создаю новый поток для создания объектов модели из данных. У меня еще не было проблем с этим методом   -  person tyczj    schedule 28.01.2015
comment
См. gist.github.com/Shywim/127f207e7248fe48400b и, пожалуйста, не перебирайте курсор, он мало смысла и, как вы сказали, ухудшает производительность   -  person pskink    schedule 28.01.2015
comment
Разве вы не могли бы взять курсор и засунуть его в другую задачу? Еще не желательно конечно.   -  person G_V    schedule 28.01.2015
comment
@G_V проблема в том, что курсор может быть закрыт загрузчиком до того, как вы закончите его цикл   -  person tyczj    schedule 28.01.2015
comment
@pskink Благодаря вашему ответу и указателю на код адаптера мой код проекта работает хорошо - это простой код, легко читаемый, вне основного потока, а пользовательский интерфейс очень плавный. Не стесняйтесь оставлять свой комментарий в качестве ответа, и я приму его.   -  person Ollie C    schedule 29.01.2015
comment
@tyczj, почему CursorLoader должен закрыть его?   -  person pskink    schedule 29.01.2015
comment
@pskink, потому что менеджер загрузчика обрабатывает закрытие курсора, и если новый курсор появляется, когда вы уже анализируете старый курсор, он закрывается, потому что он больше не действителен. см. этот вопрос stackoverflow.com/questions/10957252/   -  person tyczj    schedule 29.01.2015
comment
@tyczj это момент, когда приходит новый курсор, это означает, что когда базовые данные изменяются, запрашивается новый курсор - основная цель CursorLoader - предоставлять актуальные данные, если базовые данные не меняются, вы можете держите курсор в течение недели или двух, он не будет закрыт - именно так CursorAdapter использует курсор, он не копирует содержимое курсора для отображения данных   -  person pskink    schedule 29.01.2015
comment
@pskink я знаю, что просто указал G_V на эту часть информации о том, почему вы действительно не хотите передавать ее в другую ветку   -  person tyczj    schedule 29.01.2015


Ответы (1)


используйте этот простой адаптер https://gist.github.com/Shywim/127f207e7248fe48400b, в качестве альтернативы вы можете используйте android.support.v17.leanback.widget.ItemBridgeAdapter с android.support.v17.leanback.widget.CursorObjectAdapter, но зачем усложнять себе жизнь?

person pskink    schedule 29.01.2015