android 无法使用@Relation在Room中获取正确的值

oalqel3c  于 2022-12-25  发布在  Android
关注(0)|答案(1)|浏览(158)

我的Room数据库中有三个表,我的查询应该返回一个包含产品详细信息的产品列表。
所有产品都是基于documentId插入的,因此当查询完成时,我需要在列表中documentId的项目。
DAO看起来像这样:

@Transaction
@Query("SELECT * FROM document_products dp LEFT JOIN products ON products.id = dp.productId LEFT JOIN products_barcodes ON products_barcodes.barcode = dp.productId WHERE dp.documentId = :documentId AND (products_barcodes.barcode = dp.productId OR products.id = dp.productId) ORDER BY timestamp ASC")
fun getProductsWithDetails(documentId: Long): Flow<List<DocumentProductWithDetails>>

如果我在这样的表中测试查询:

其中documentId为5,查询将返回正确的值:

但这些值在应用程序中不正确,可能是DocumentProductWithDetails中@Relation的原因,但我无法找到问题所在,在应用程序内部的事实中,数据显示为:

因此,由于包含productId的项目已保存三次,因此将显示最后一个项目,而不是与documentId相关的项目
包含@Relation注解的数据类如下所示:

@JsonClass(generateAdapter = true)
data class DocumentProductWithDetails(
    @Relation(
        parentColumn = "id",
        entityColumn = "productId"
    )
    var product: DocumentProduct,
    @Embedded
    var details: ProductWithBarcodes?
)

记录产品和带条形码产品的位置:

data class DocumentProduct(
    @PrimaryKey(autoGenerate = true)
    var id: Long,
    var productId: String,
    var quantity: Float,
    var orderQuantity: Float,
    var purchase: Float,
    var documentId: Long,
    var labelType: String?,
    var timestamp: Long?
)

data class ProductWithBarcodes(
    @Embedded
    var product: Product,
    @Relation(
        parentColumn = "id",
        entityColumn = "productId"
    )
    var barcodes: List<Barcode>
)
g2ieeal7

g2ieeal71#

因此,当具有productId的项保存三次时,它将显示最后一个项,而不是与documentId相关的项

如果查询的任何列具有相同的列名,则分配的值可能(将)不一致,因为重复名称的最后一列的值将是分配给具有相同名称的所有其它列的值(等等)。

我建议修复是使用唯一列名。例如,在条形码中使用列名而不是productId,更能指示值的使用,它可以被视为产品的Map,因此可能是barcode_productIdMap

  • 错误不在于查询,而在于Room如何处理检索和赋值。

考虑你的第二个图像(带有一些标记):-

在本答复中,将通过示例对上述内容进行更详细的解释
正确的id、productId、quantity(* 修辞学 )是什么。
“房间”怎么会知道什么东西要去哪里呢?(
修辞学 *)
假设以下查询提取完全相同的数据(但数据列的顺序不同):

@Query("SELECT products.*,products_barcodes.*,document_products.* FROM document_products dp LEFT JOIN products ON products.id = ....

Room如何科普不同的顺序(正确的productId应该是第一个还是第二个(* 修辞学 *))。

  • 对于唯一的列名,列顺序是不相关的,因为Room然后确切地知道哪个列与哪个字段相关联,没有歧义。
  • 具有唯一列的tablename. columnname可以简化为SQL中的列名,因此可以简化SQL。

相关问题