分页库+房间未获取@relation

时间:2019-04-23 11:41:30

标签: android kotlin android-room android-architecture-components android-paging-library

在我正在开发的应用中,我需要非常简单地从Room数据库中获取数据。有关系。所有简单的查询返回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表中的所有列都在那里(namesome_other_column等),关系是唯一但主要的问题。

(如果有任何相关性,我可以提供有关分页实现的更多详细信息。)

1 个答案:

答案 0 :(得分:0)

事实证明,这是Room中的一个问题,即使您不使用分页库,在给定大量查询(数百个结果+)的情况下,也会发生这种情况。

没有解决方案,但是有一种针对1:1关系的解决方法:使用@embedded代替@relation。但是,这可能会由于需要设置prefix并枚举查询中的所有列并为其提供别名而使事情复杂化。那很痛苦,但生活就是如此。房间糟透了。

或者如果连接的实体没有太多的列并且没有任何重复的名称,则将这些列/属性复制到查询返回的DTO中也可以很好地工作。