Android 如何使用RoomDatabase实现搜索功能
我在使用RoomDatabase实现搜索功能时遇到了一个问题 我最近通过改造实现了搜索功能,效果很好,没有问题 但是,在没有internet的情况下,如果用户希望在产品之间搜索,则会给出一个错误,即这与未连接到internet有关Android 如何使用RoomDatabase实现搜索功能,android,kotlin,search,mvvm,Android,Kotlin,Search,Mvvm,我在使用RoomDatabase实现搜索功能时遇到了一个问题 我最近通过改造实现了搜索功能,效果很好,没有问题 但是,在没有internet的情况下,如果用户希望在产品之间搜索,则会给出一个错误,即这与未连接到internet有关 所以,我决定用room实现搜索功能,并尝试了很多代码,但没有得到正确的结果。当填写编辑文本并点击按钮时,可获得不按标题打印的结果 下面是我尝试过的一些代码: 房间表实体: @entity(tableName = cart ) class RoomTables {
所以,我决定用room实现搜索功能,并尝试了很多代码,但没有得到正确的结果。当填写编辑文本并点击按钮时,可获得不按标题打印的结果 下面是我尝试过的一些代码: 房间表实体:
@entity(tableName = cart )
class RoomTables {
@primarykey
val id : Int ,
val title : String
}
道:
我还有一个recyclerview用于展示产品,以防你想知道
有人知道问题出在哪里吗
我做了很多搜索,但没有找到任何解决方案
我希望你们能帮我
thank在advanced中。您没有得到结果,因为您正在启动与
viewModelScope.launch的协同程序。如果您希望使用协同程序而不是观察和反应立即获得结果,请进行以下更改:
首先,你应该知道:
房间2.1增加了对Kotlin协同程序的支持。DAO方法现在可以
标记为挂起以确保它们不会在主服务器上执行
线
正如弗洛里娜·蒙特内斯库所说
DAOget
方法应如下所示:
@Query("SELECT * FROM cart")
suspend fun get(): List<RoomTables>
suspend fun getProduct(title : String): List<RoomTables> = db.GetDao().get().filter {
it.title.contains(title , true)
}
suspend fun getProduct(title: String) = repository.getProduct(title)
lifecycleScope.launch {
val productList = viewModel.getProduct(EditTextSearch.text.toString())
//Do whatever you need with the result here
}
您的ViewModelgetProduct
方法应该如下所示:
@Query("SELECT * FROM cart")
suspend fun get(): List<RoomTables>
suspend fun getProduct(title : String): List<RoomTables> = db.GetDao().get().filter {
it.title.contains(title , true)
}
suspend fun getProduct(title: String) = repository.getProduct(title)
lifecycleScope.launch {
val productList = viewModel.getProduct(EditTextSearch.text.toString())
//Do whatever you need with the result here
}
现在,为了调用ViewModelgetProduct
方法,您应该在活动内部启动一个协同程序,如下所示:
@Query("SELECT * FROM cart")
suspend fun get(): List<RoomTables>
suspend fun getProduct(title : String): List<RoomTables> = db.GetDao().get().filter {
it.title.contains(title , true)
}
suspend fun getProduct(title: String) = repository.getProduct(title)
lifecycleScope.launch {
val productList = viewModel.getProduct(EditTextSearch.text.toString())
//Do whatever you need with the result here
}
要使用lifecycleScope
您需要将androidx.lifecycle:lifecycle runtime ktx:2.2.0-alpha01
或更高版本添加到您的项目中
此外,正如@iknow在评论中建议的那样,您可以优化查询,而不是在存储库中过滤结果。到底是什么不起作用?您得到的是空结果还是错误?此外,您还可以编写如下查询:@query(“SELECT*FROM cart WHERE title like:filter”)fun get(filter:String):List
在填充编辑文本时,单击按钮以获取不按标题排序的结果。我也尝试了你提到的代码,我一步一步地实现了你的代码。但什么都不能挽回。而且也没有错误。有一种方法可以让我明白问题出在哪里?@BahadorEslami你说什么都不回来是什么意思?您没有得到响应或结果为空?我只想在填写编辑文本输入并单击按钮后,通过标题返回产品。但什么也没发生。看起来我的代码有问题,但我不知道where@BahadorEslami在lifecycleScope.launch
块中调用viewModel.getProduct
的行之后,将结果打印到控制台。你应该在那里看到结果。如果您尝试在该块之后使用结果,则它似乎没有返回任何结果,这是因为进行调用的协同程序正在同时执行该操作。AndroidStudio项目。grocerystore I/System.out:[]。给我这个