我不知道如何在Repository和ViewModel中正确地实现过滤器查询,以使用它在Textview或其他任何东西中显示过滤后的字符串。My Entity、Dao、Repository和ViewModel如下:
用户.kt
@Entity(tableName = "user_data")
data class User (
@PrimaryKey(autoGenerate = true) val id: Int,
@ColumnInfo(name = "name") val name: String
)
字符串
UserDao.kt
@Dao
interface UserDao {
@Insert
fun addUser(user: User)
@Query("SELECT name FROM user_data WHERE name LIKE :filter LIMIT 1")
fun getFilteredUser(filter: String): LiveData<String>
}
型
用户仓库.kt
class UserRepository(private val userDao: UserDao) {
fun addUser(user: User) { userDao.addUser(User) }
fun getFilteredUser(filter: String) {userDao.getFilteredUser(filter)}
}
型
UserViewModel.kt
class UserViewModel(application: Application): AndroidViewModel(application) {
private val repository: UserRepository
init {
val userDao = UserDatabase.getDatabase(application).userDao()
repository = UserRepository(userDao )
}
fun addUser(user: User) {
viewModelScope.launch(Dispatchers.IO){
repository.addUser(user)
}
}
fun getFilteredUser(filter: String){
return repository.getFilteredUser(filter)
}
}
型
我该如何从这里着手,使之成为可能。在textview或类似的东西中显示过滤后的用户字符串,以及如何在存储库和视图模型中正确地编写方法?谢谢您的帮助!
2条答案
按热度按时间kcwpcxri1#
尝试以下操作
用户道
按如下方式更改
getFilteredUser
字符串
UserRepo
使用协程执行数据库I/O操作
型
视图模型
型
活动
型
kpbwa7wx2#
我发现的最简单的方法:
1 -在DAO接口中,为要使用的SQL查询添加参数。举例来说:
字符串
本例中,columnName表示要应用查询条件的表中的列名,queryParam是查询的参数。
2 -更新您的存储库以将参数值传递给DAO方法。下面是一个例子:
型
本例中仓库中的getCrPairsWithQuery函数接受queryParam参数,直接调用DAO的getCrPairs**方法。
3 -最后,在ViewModel中,更新获取数据的函数以包含参数值。下面是一个例子:
型
在本例中,ViewModel中的fetchCrPairsWithQuery函数使用提供的查询参数触发仓库的getCrPairsWithQuery函数。使用collect收集得到的Flow,使用**_crPairsLiveData.value将发出的值设置为crPairsLiveData**。
通过这些更改,您现在可以在DAO方法中向SQL查询传递参数,并使用 crPairsLiveData.observeAsState()和.value在ViewModel中检索过滤后的Flow**。.let**