#android #kotlin #android-room #android-architecture-components #android-paging-library
#Android #kotlin #android-комната #android-архитектура-компоненты #android-библиотека подкачки
Вопрос:
В приложении, над которым я работаю, мне нужно очень просто извлечь данные из базы данных Комнат. Здесь замешаны отношения. Все работало отлично с возвращением простых запросов LiveData
, однако размер данных, которые необходимо извлечь, вырос намного больше, чем ожидалось, и он также содержит большие двоичные объекты (изображения), которые могут сделать запрос очень медленным. Я решил использовать библиотеку подкачки, реализованную следующим образом, но по какой-то причине @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
и т.д.), Отношения являются единственной, но серьезной проблемой.
(Я могу предоставить более подробную информацию о реализации подкачки, если это имеет какое-либо значение.)
Ответ №1:
Оказывается, это проблема в Room, которая может возникнуть, даже если вы не используете библиотеку подкачки, учитывая объемный запрос (сотни результатов ).
Решения нет, но есть обходной путь для отношений 1: 1: использование @embedded
вместо @relation
. Однако это может усложнить ситуацию из-за необходимости установки prefix
и перечисления всех столбцов в запросе и присвоения им псевдонимов. Это боль, но такова жизнь. Комната отстой.
Или, если у объединенной сущности не слишком много столбцов и нет повторяющихся имен, так же хорошо работает копирование этих столбцов / свойств в DTO, который возвращается запросом.