[英]How to implement a Room LiveData filter
I do not know how to implement a filter query properly inside the Repository and the ViewModel to use it to display the filtered string in a Textview or anything else really.我不知道如何在存储库和 ViewModel 中正确实现过滤器查询,以使用它在 Textview 或其他任何东西中显示过滤后的字符串。 My Entity, Dao, Repository, and ViewModel are as follows:
我的Entity、Dao、Repository、ViewModel如下:
User.kt用户.kt
@Entity(tableName = "user_data")
data class User (
@PrimaryKey(autoGenerate = true) val id: Int,
@ColumnInfo(name = "name") val name: String
)
UserDao.kt用户道.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>
}
UserRepository.kt用户存储库.kt
class UserRepository(private val userDao: UserDao) {
fun addUser(user: User) { userDao.addUser(User) }
fun getFilteredUser(filter: String) {userDao.getFilteredUser(filter)}
}
UserViewModel.kt用户视图模型.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)
}
}
How would I proceed from here to make it possible to eg display the filtered User String in a textview or anything like that and how do I write the method correctly inside the repository and the viewmodel?我将如何从这里开始,以便可以在 textview 或类似的东西中显示过滤的用户字符串,以及如何在存储库和视图模型中正确编写方法? Thank you for your help!
谢谢您的帮助!
Try the following尝试以下
UserDao用户道
change getFilteredUser
as follows更改
getFilteredUser
如下
@Query("SELECT name FROM user_data WHERE name LIKE '%' || :filter || '%' LIMIT 1")
fun getFilteredUser(filter: String): Stringl̥
UserRepo用户回购
use coroutines to perform the database I/O operations使用协程执行数据库 I/O 操作
suspend fun addUser(user: User) {
withContext(Dispatchers.IO) {
userDao.addUser(user)
}
}
suspend fun getFilteredUser(filter: String): String {
return withContext(Dispatchers.IO) {
userDao.getFilteredUser(filter)
}
}
ViewModel视图模型
fun addUser(user: User) {
viewModelScope.launch {
repository.addUser(user)
}
}
private val _dataToUi = MutableLiveData<String>()
val dataToUi: LiveData<String>
get() = _dataToUi
suspend fun getFilteredUser(filter: String): String? {
return withContext(Dispatchers.IO) {
repository.getFilteredUser(filter)
}
}
// to set the filterquery from the fragment/activity
fun setFliterQuery(query: String) {
viewModelScope.launch {
_dataToUi.value = getFilteredUser(query)
}
}
Activity活动
binding.button.setOnClickListener {
val queryKey = binding.queryKey.text.toString()
Log.i("activity", queryKey)
userViewModel.setFliterQuery(queryKey)
}
userViewModel.dataToUi.observe(this) { result ->
result?.apply {
Log.i("activity", result)
binding.resultText.text = result
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.