В приложении, над которым я работаю, мне нужно очень просто получить данные из базы данных Room.Есть отношения вовлечены.Все отлично работало с простыми запросами, возвращающими LiveData
, однако, размер данных, которые необходимо извлечь, вырос намного больше, чем ожидалось, и он также содержит большие двоичные объекты (изображения), которые могут сделать запрос очень медленным.Я решил использовать библиотеку Paging, реализованную следующим образом, но по какой-то причине аннотация @relation
просто больше не работает.
Выбранная сущность является DTO, выглядит в основном так:
data class EntityOtherAnotherDTO(
var id: Long? = null,
var name: String? = null,
...,
@Relation(parentColumn = "id", entityColumn = "entity_id", entity = OtherEntity::class)
var others: List<OtherEntity>,
@Relation(parentColumn = "id", entityColumn = "entity_id", entity = AnotherEntity::class)
var anothers: List<AnotherEntity>
)
Запрос:
@Query("SELECT * FROM other
JOIN entity ON entity.id = other.entity_id
JOIN another ON entity.id = another.entity_id
WHERE entity.deleted = 0
ORDER BY
CASE WHEN other.some_column IS NULL THEN 1 ELSE 0 END,
other.some_column ASC,
entity.some_other_column DESC")
fun getAllEntityOtherAnotherDTOs(): DataSource.Factory<Int, EntityOtherAnotherDTO>
Когда запрос был таким: fun getAllEntityOtherAnotherDTOs(): LiveData<List<EntityOtherAnotherDTO>>
все работало просто отлично.Результаты были упорядочены по мере необходимости, и все данные были получены, включая списки, помеченные @relation
.Но после изменения типа возвращаемого значения на DataSource.Factory
и, конечно, реализации адаптера подкачки, отношения возвращаются пустыми.
Упорядочение по-прежнему работает отлично, запрос, кажется, работает точно так же, как и раньше, подкачка также работает, но данные просто отсутствуют.Там есть все столбцы в таблице entity
(name
, some_other_column
и т. Д.), Отношения - единственная, но главная проблема.
(я могу предоставить более подробную информацию о реализации подкачки, еслиэто имеет какое-либо отношение.)