Библиотека подкачки комната, не извлекаемая @relation

#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, который возвращается запросом.