0

在我正在开发的应用程序中,我需要非常简单地从 Room 数据库中获取数据。有关系。一切都与返回的简单查询完美配合LiveData,但是,需要检索的数据大小比预期的要大得多,并且它还包含 blob(图像),这会使查询非常慢。我已经决定使用分页库,实现如下,但由于某种原因,@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),关系是唯一但主要的问题。

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

4

1 回答 1

2

事实证明,这是 Room 中的一个问题,即使您不使用 Paging 库,给定一个大型(数百个结果+)查询,也可能发生这种问题。

没有解决方案,但有一种解决 1:1 关系的方法:使用@embedded而不是@relation. prefix但是,通过设置 a并枚举查询中的所有列并为它们赋予别名,这可能会使事情复杂化。那是痛苦,但这就是生活。房间很烂。

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

于 2019-04-25T13:08:31.613 回答