我正在尝试实时计算一些值,当我在数据库中插入内容并使用 getCount() 获取它时,它返回得很好,但我想实时更新栏中的文本,它在应用程序重置后更新但不实时更新,是吗?缺少什么吗?
查看模型:
@HiltViewModel
class appViewModel @Inject constructor(
private val appDao: appDao
) : ViewModel() {
private val _Count = MutableStateFlow(0)
val Count: StateFlow<Int> = _Count.asStateFlow()
init {
viewModelScope.launch {
appDao.getCount()
.collect { count ->
_Count.value = count
}
}
}
}
酒吧:
@Composable
fun WkTopBar(navController: NavController?) {
val appViewModel: appViewModel = hiltViewModel()
val Count by appViewModel.Count.collectAsState()
Text(text = "count: $Count", color = Color.Black)
}
道:
@Entity(tableName = "app")
data class app(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
)
@Dao
interface appDao {
@Query("SELECT COUNT(*) FROM table WHERE something = 0")
fun getCount(): Flow<Int>
}
数据库:
@Database(entities = [app::class], version = 1, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
abstract fun appDao(): appDao
companion object {
@Volatile
private var INSTANCE: AppDatabase? = null
fun getDatabase(context: Context): AppDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"app_database"
).build()
INSTANCE = instance
instance
}
}
}
}
我尝试使用 Flow 和 LiveData 但不起作用
像这样更改你的 DAO 接口:
@Dao
interface appDao {
@Query("SELECT * FROM table WHERE something = 0")
fun getAllItems(): Flow<Entity>
}
然后在 viewModel 中,您可以使用
filter
运算符收集此流。
init {
viewModelScope.launch {
appDao.getAllItems()
.filter { it.something == 0 }
.collect { list ->
_Count.value = list.size
}
}
}