Как получить данные из DataSource.Factory - PullRequest
0 голосов
/ 06 февраля 2019

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

@Query("SELECT * FROM PERSON_TABLE ORDER BY NAME DESC"
abstract fun getElements(): DataSource.Factory<Int, Person>

Затем в Activity я называю это так:

override fun onCreate(...)
{
    ...

    val data = dao.getElements()
}

Я хочу получить все Person s, возможно, в виде списка.Как мне это сделать?

Я не понимаю, как работает DataSource.Factory<Int, Person>.

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Добавляя к ответу @Sergey, вы можете использовать PagedList<>.snapshot() для получения обычного списка

 // Get the DataSource from the database
 val dataSource: DataSource.Factory<Int, Person> = dao.getElements()

 // Get the dataSource as LiveData
 val data = dataSource.toLiveData(20 /* page size */)

 // In UI
 vm.data.observer(this, Observer{pagedList->
  // To get the pagedList as a regular list -
  val dataList = pagedList.snapshot()
 })

Примечание : функция snapshot() дает вам только текущийдоступные элементы в вашем pagedList.

0 голосов
/ 07 февраля 2019

Согласно документам :

Как правило, ваш код пользовательского интерфейса соблюдает объект LiveData (или, если вы используете RxJava2, объект Flowable или Observable), которыйнаходится в ViewModel вашего приложения.Этот наблюдаемый объект образует связь между представлением и содержимым данных списка вашего приложения.

Чтобы создать один из этих наблюдаемых объектов PagedList, передайте экземпляр DataSource.Factory объекту LivePagedListBuilder или RxPagedListBuilder.Объект DataSource загружает страницы для одного PagedList.Фабричный класс создает новые экземпляры PagedList в ответ на обновления содержимого, такие как аннулирование таблицы базы данных и обновление сети.Библиотека постоянства Room может предоставить вам объекты DataSource.Factory, или вы можете создать свой собственный.

Пример кода следующий:

// The Int type argument corresponds to a PositionalDataSource object.
val data: DataSource.Factory<Int, Person> = dao.getElements()

val dataList: LiveData<PagedList<Person>> = LivePagedListBuilder(data, /* page size */ 20).build()

Итак, вам нужно передатьваш DataSource.Factory<Int, Person> объект на LivePagedListBuilder и в конце вы получите LiveData<PagedList<Person>>, который вы можете наблюдать.


После этого вам нужно подключить LiveData кPagedListAdapter как показано в следующем фрагменте кода:

private val adapter = YourDataAdapter()

override fun onCreate(savedInstanceState: Bundle?) {
    dataList.observe(this, Observer { adapter.submitList(it) })
}

Пример кода адаптера, который вы можете найти здесь .

...