我有一个在MVVM体系结构中实现的回收器视图和房间数据库。创建此查询以在DAO文件中排序回收器视图。
@Query("SELECT * FROM task_table ORDER BY " +
"CASE WHEN:choice =1 THEN date END ASC," +
"CASE WHEN:choice=2 THEN title END ASC")
fun readAllData(choice : Int): LiveData<MutableList<Task>>
存储库文件
class TaskRepository(private val taskDao: TaskDao) {
val readAllData: LiveData<MutableList<Task>> = taskDao.readAllData(1)
suspend fun addTask(task: Task) {
taskDao.addTask(task)
}
suspend fun deleteTask(task: Task) {
taskDao.deleteTask(task)
}
suspend fun updateTask(task: Task) {
taskDao.updateTask(task)
}
fun deleteAllTasks() {
taskDao.deleteAllTasks()
}
}
视图模型文件
class TaskViewModel(
application: Application,
) : AndroidViewModel(application) {
val readAllData: LiveData<MutableList<Task>>
private val repository: TaskRepository
init {
val taskDao = TaskDatabase.getDatabase(application).taskDao()
repository = TaskRepository(taskDao)
readAllData = repository.readAllData
}
fun addTask(task: Task) {
viewModelScope.launch(Dispatchers.IO) {
repository.addTask(task)
}
}
fun updateTask(task: Task) {
viewModelScope.launch(Dispatchers.IO) {
repository.updateTask(task)
}
}
fun deleteTask(task: Task) {
viewModelScope.launch(Dispatchers.IO) {
repository.deleteTask(task)
}
}
fun deleteAllTask() {
viewModelScope.launch(Dispatchers.IO) {
repository.deleteAllTasks()
}
}
}
我不知道如何在UI中实现排序菜单,以使我的房间数据库按属性排序。这意味着我想将数据从Fragment传递到Repository文件,以便DAO可以带参数。
1条答案
按热度按时间xdnvmnnf1#
首先,您不希望将
MutableList
与LiveData
一起使用。如果您只想添加/删除LiveData中的值,则底层对象不会更改,您也不会从中获得更新。最常见的方法(AFAIK)是使用
LiveData
来修改查询。通过Transformations.switchMap
的组合,您可以使用一个LiveData的输出并将其转换为另一个LiveData
(您的查询)。_filter
中的任何更改都将通过switchMap
触发重新评估,switchMap
将从您的repository
中获取readAllData
。