Android kotlin 房间数据库

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

我正在尝试实时计算一些值,当我在数据库中插入内容并使用 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 但不起作用

android kotlin android-room
1个回答
0
投票

像这样更改你的 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
      }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.