Библиотека подкачки: как объединить результирующий набор из 3 комнатных объектов? - PullRequest
0 голосов
/ 16 октября 2019

Очень просто использовать библиотеку подкачки Android с Room, если элемент списка может быть напрямую получен из объекта Room , как описано в этом . Но как нам реализовать пейджинг, если элемент списка на самом деле представляет собой, скажем, 3 объекта?

Рассмотрим,

data class ListItem(val name, val officeAddress, val lastTravelledPlaceName)

и

@Entity
data class User(@PrimaryKey val id, val name)


@Entity
data class Office(@PrimaryKey val id, val address)

@Entity 
data class Places(@PrimaryKey val id, val name)

Одним из решений может быть использование подкачки на User, а затем запрос Office и Places во время вызова адаптера onBind..(), но это не похоже на правильный подход.

1 Ответ

1 голос
/ 16 октября 2019

@ Embedded аннотация может использоваться для объединения сущностей в классе.

Например, при использовании сущностей из вопроса альтернативой для класса ListItem может быть: -

Префикс
class UserOfficePlacesCombined() {

    @Embedded(prefix = "user")
    var user: User? = null
    @Embedded(prefix = "office")
    var office: Office? = null
    @Embedded(prefix = "places")
    var places: Places? = null
}
  • использовался, чтобы избежать неоднозначности имен столбцов, короче говоря, все столбцы будут иметь префикс с именем соответствующей таблицы (см. Следующий запрос Дао)

Вы можетезатем извлеките UserOfficePlacesCombined с помощью Дао-запроса, такого как: -

@Query("SELECT user.id AS userid, user.name AS username, " +
        "office.id AS officeid, office.address AS officeaddress, " +
        "places.id AS placesid, places.name AS placesname " +
        "FROM User JOIN Office ON User.id = Office.id JOIN Places ON User.id = Places.id")
fun getAllUserOfficePlacesCombined(): UserOfficePlacesCombined
  • Примечание, чтобы обойти неопределенности, все столбцы были переименованы с использованием ключевого слова AS
  • Если вопрос не указываетотношения между таблицами, как таковой, запрос объединит таблицы в соответствии с их столбцом id.
    • маловероятно, что это будет иметь какое-либо применение в приложении, но было сделано из-за недостатка информации и для удобства.

это вместе в качестве примера, сделав некоторые предположения, затем рассмотрим следующую демонстрацию: -

    val userOfficePlacesDoa = db.userOfficePlacesDao()
    val user1 = User(1,"USER1")
    val office1 = Office(1,"Office1")
    val places1 = Places(1,"Place1")

    userOfficePlacesDoa.insertUser(user1)
    userOfficePlacesDoa.insertOffice(office1)
    userOfficePlacesDoa.insertPlaces(places1)
    var uopc: UserOfficePlacesCombined = userOfficePlacesDoa.getAllUserOfficePlacesCombined()
    Log.d("UOPCINFO","User Name is " + uopc.user?.name + " Office Address is" + uopc.office?.address + " Places name is " + uopc.places?.name)

В результате получим: -

2019-10-16 22:35:16.442 D/UOPCINFO: User Name is USER1 Office Address isOffice1 Places name is Place1
...