我的数据库将数据存储在收据和文件实体中。这些实体具有一对多关系(一张收据可以有多个文件)。我需要选择“带文件的收据”,但不是这些表中的所有字段。
我想从收据实体中选择
id
、description
和 createdAt
,并从文件实体中选择 imageUrl
。这些实体包含我不需要的其他字段,我想创建一个显示基本信息的列表。
我尝试了这个,但收到错误:
无法弄清楚如何从光标读取此字段
@Dao
abstract class ReceiptDao {
@Query(
"""
SELECT id, description, createdAt, (SELECT imageUrl FROM files WHERE receiptId == :id) as listOfImageUrls
FROM receipts
WHERE id == ":id"
ORDER BY createdAt DESC
""" )
abstract fun findReceiptsWithFilesById(id: Long): List<ReceiptWithFiles>
}
class ReceiptWithFiles(
val id: Long,
val description: String? = null,
val createdAt: LocalDateTime? = null,
val listOfImageUrls : List<String> = listOf(),
)
通常,您会在 POJO 中使用
@Embedded
和 @Relation
的组合。
@Embedded
嵌入父对象(收据),@Relaion
嵌入子对象(列表)所以:-
class ReceiptWithFiles(
@Embedded
val receipts: Receipt,
@Relation(entity = Files::class, parentColumn= "id", entityColumn="receiptId")
val files: List<Files>
)
您可以使用以下方式调用上面的内容
@Transaction
@Query("SELECT * FROM receipts WHERE id =:id ORDER BY createdAt DESC")
abstract fun findReceiptsWithFilesById(id: Long): List<ReceiptWithFiles>
这并不完全返回所述字段(id、description 和 createAt),而是返回整个 Receipts 对象,其中包括所述字段和相关文件对象列表。