kotlin 如何实现房间LiveData过滤器

2ledvvac  于 2023-08-07  发布在  Kotlin
关注(0)|答案(2)|浏览(123)

我不知道如何在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或类似的东西中显示过滤后的用户字符串,以及如何在存储库和视图模型中正确地编写方法?谢谢您的帮助!

kcwpcxri

kcwpcxri1#

尝试以下操作

用户道

按如下方式更改getFilteredUser

@Query("SELECT name FROM user_data WHERE name LIKE '%' || :filter || '%' LIMIT 1")
    fun getFilteredUser(filter: String): Stringl̥

字符串

UserRepo

使用协程执行数据库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)
        }
    }

视图模型

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)
        }
    }

活动

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
            }
        }

kpbwa7wx

kpbwa7wx2#

我发现的最简单的方法:
1 -在DAO接口中,为要使用的SQL查询添加参数。举例来说:

@Dao
interface CrPairsDao {
    @Query("SELECT * FROM CrPairsModel WHERE columnName = :queryParam")
    fun getCrPairs(queryParam: String): Flow<List<CrPairsModel>>
}

字符串
本例中,columnName表示要应用查询条件的表中的列名,queryParam是查询的参数。
2 -更新您的存储库以将参数值传递给DAO方法。下面是一个例子:

class CrPairsRepository(private val crPairsDao: CrPairsDao) {
    fun getCrPairsWithQuery(queryParam: String): Flow<List<CrPairsModel>> {
        return crPairsDao.getCrPairs(queryParam)
    }
}


本例中仓库中的getCrPairsWithQuery函数接受queryParam参数,直接调用DAO的getCrPairs**方法。
3 -最后,在ViewModel中,更新获取数据的函数以包含参数值。下面是一个例子:

class CrPairsViewModel(private val crPairsRepository: CrPairsRepository) : ViewModel() {
    private val _crPairsLiveData = MutableLiveData<List<CrPairsModel>>()
    val crPairsLiveData: LiveData<List<CrPairsModel>> = _crPairsLiveData

    fun fetchCrPairsWithQuery(queryParam: String) {
        viewModelScope.launch {
            crPairsRepository.getCrPairsWithQuery(queryParam).collect {
                _crPairsLiveData.value = it
            }
        }
    }
}


在本例中,ViewModel中的fetchCrPairsWithQuery函数使用提供的查询参数触发仓库的getCrPairsWithQuery函数。使用collect收集得到的Flow,使用**_crPairsLiveData.value将发出的值设置为crPairsLiveData**。
通过这些更改,您现在可以在DAO方法中向SQL查询传递参数,并使用 crPairsLiveData.observeAsState().value在ViewModel中检索过滤后的Flow**。.let**

相关问题