分页库+房间不获取@relation
Paging library + room not fetching @relation
在我正在开发的应用程序中,我需要非常简单地从 Room 数据库中获取数据。有关系。一切都与简单的查询 returning LiveData
完美配合,但是,需要检索的数据的大小比预期的要大得多,并且它还包含 blob(图像),这可以使查询非常慢。我已经决定使用 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
注释的列表。但是在将 return 类型更改为 DataSource.Factory
并且当然实现了分页适配器之后,关系 return 为空。
排序仍然完美,查询似乎与以前完全一样,分页也有效,但只是缺少数据。 entity
table 中的所有列都在那里(name
、some_other_column
等),关系是唯一但主要的问题。
(如果相关,我可以提供有关分页实现的更多详细信息。)
事实证明,这是 Room 中的一个问题,即使您不使用 Paging 库,给定一个大型(数百个以上的结果)查询也可能发生。
没有解决方案,但是 1:1 关系有一个解决方法:使用 @embedded
而不是 @relation
。然而,由于需要设置 prefix
并枚举查询中的所有列并为它们提供别名,这会使事情变得复杂。那是痛苦,但这就是生活。房间糟透了。
或者,如果加入的实体没有太多列并且没有任何重复名称,则在查询返回的 DTO 中复制那些 columns/properties 也同样有效。
在我正在开发的应用程序中,我需要非常简单地从 Room 数据库中获取数据。有关系。一切都与简单的查询 returning LiveData
完美配合,但是,需要检索的数据的大小比预期的要大得多,并且它还包含 blob(图像),这可以使查询非常慢。我已经决定使用 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
注释的列表。但是在将 return 类型更改为 DataSource.Factory
并且当然实现了分页适配器之后,关系 return 为空。
排序仍然完美,查询似乎与以前完全一样,分页也有效,但只是缺少数据。 entity
table 中的所有列都在那里(name
、some_other_column
等),关系是唯一但主要的问题。
(如果相关,我可以提供有关分页实现的更多详细信息。)
事实证明,这是 Room 中的一个问题,即使您不使用 Paging 库,给定一个大型(数百个以上的结果)查询也可能发生。
没有解决方案,但是 1:1 关系有一个解决方法:使用 @embedded
而不是 @relation
。然而,由于需要设置 prefix
并枚举查询中的所有列并为它们提供别名,这会使事情变得复杂。那是痛苦,但这就是生活。房间糟透了。
或者,如果加入的实体没有太多列并且没有任何重复名称,则在查询返回的 DTO 中复制那些 columns/properties 也同样有效。