我有两张桌子,
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>>
。
这是预期的还是我错过了什么?
这些症状与 RoomDatabase 的两个单独实例分别用于获取 Flow<> 和将新实体插入数据库的情况非常吻合。
您可能会发现它已通过在您选择的 DI 中将数据库设置为单例来修复。