Android Room - 返回 Flow 的 DAO 方法仅为组合对象发出一次数据

问题描述 投票:0回答:1

我有两张桌子,

Location
Weather
。他们有一对一的关系。
Weather
有一个外键,可将相应条目的
id
保留在
Location
中。

@Entity(tableName = "location")
data class Location(
    @PrimaryKey(autoGenerate = true) val id: Long = 0,
    ...
)

@Entity(
    tableName = "weather",
    foreignKeys = [
        ForeignKey(
            entity = Location::class,
            parentColumns = ["id"],
            childColumns = ["locationId"],
            onDelete = ForeignKey.CASCADE
        )
    ]
)
data class Weather(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    @ColumnInfo(name = "locationId") val locationId: Long,
    ...
)

然后我有这个复合类:

data class LocationWeather(
    @Embedded val location: Location,
    @Relation(
        parentColumn = "id",
        entityColumn = "locationId"
    )
    val weather: Weather
)

我想返回

LocationWeather
列表流,以便当任何表更新时,我期望发出一个新值。这是 DAO 方法:

@Transaction
@Query("SELECT * FROM location")
fun getLocationWeatherList(): Flow<List<LocationWeather>>

然后,我直接在 ViewModel 中调用 DAO 方法(目前,中间会有领域层和数据层)来测试它:

locationDao.getLocationWeatherList().onEach {
    // Only triggered once...
}.launchIn(viewModelScope)

但是,我只获取一次数据。即使数据库检查器显示新条目,在更新任何

Location
Weather
后,也没有其他发出。

我遵循了官方docs。唯一的区别是,在 DAO 方法中,我返回

List<LocationWeather>
,而不是返回
Flow<List<LocationWeather>>

这是预期的还是我错过了什么?

android android-sqlite android-room kotlin-coroutines kotlin-flow
1个回答
0
投票

这些症状与 RoomDatabase 的两个单独实例分别用于获取 Flow<> 和将新实体插入数据库的情况非常吻合。

您可能会发现它已通过在您选择的 DI 中将数据库设置为单例来修复。

© www.soinside.com 2019 - 2024. All rights reserved.