Библиотека подкачки + комната не загружается @relation - PullRequest
0 голосов
/ 23 апреля 2019

В приложении, над которым я работаю, мне нужно очень просто получить данные из базы данных 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 и т. Д.), Отношения - единственная, но главная проблема.

(я могу предоставить более подробную информацию о реализации подкачки, еслиэто имеет какое-либо отношение.)

1 Ответ

0 голосов
/ 25 апреля 2019

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

Решения нет, но естьэто обходной путь для отношений 1: 1: использование @embedded вместо @relation.Однако это может усложнить ситуацию из-за необходимости установки prefix, перечисления всех столбцов в запросе и присвоения им псевдонимов.Это боль, но такова жизнь.Комната - отстой.

Или, если у объединяемой сущности не слишком много столбцов и нет повторяющихся имен, она работает так же хорошо, что копирует эти столбцы / свойства в DTO, возвращаемом запросом..

...