Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用RoomDatabase实现搜索功能_Android_Kotlin_Search_Mvvm - Fatal编程技术网

Android 如何使用RoomDatabase实现搜索功能

Android 如何使用RoomDatabase实现搜索功能,android,kotlin,search,mvvm,Android,Kotlin,Search,Mvvm,我在使用RoomDatabase实现搜索功能时遇到了一个问题 我最近通过改造实现了搜索功能,效果很好,没有问题 但是,在没有internet的情况下,如果用户希望在产品之间搜索,则会给出一个错误,即这与未连接到internet有关 所以,我决定用room实现搜索功能,并尝试了很多代码,但没有得到正确的结果。当填写编辑文本并点击按钮时,可获得不按标题打印的结果 下面是我尝试过的一些代码: 房间表实体: @entity(tableName = cart ) class RoomTables {

我在使用RoomDatabase实现搜索功能时遇到了一个问题

我最近通过改造实现了搜索功能,效果很好,没有问题

但是,在没有internet的情况下,如果用户希望在产品之间搜索,则会给出一个错误,即这与未连接到internet有关


所以,我决定用room实现搜索功能,并尝试了很多代码,但没有得到正确的结果。当填写编辑文本并点击按钮时,可获得不按标题打印的结果

下面是我尝试过的一些代码:

房间表实体:

@entity(tableName = cart )
class RoomTables { 

 @primarykey 
 val id : Int ,
 val title : String 
}
道:

我还有一个recyclerview用于展示产品,以防你想知道

有人知道问题出在哪里吗

我做了很多搜索,但没有找到任何解决方案

我希望你们能帮我


thank在advanced中。

您没有得到结果,因为您正在启动与
viewModelScope.launch的协同程序。如果您希望使用协同程序而不是观察和反应立即获得结果,请进行以下更改:

首先,你应该知道:

房间2.1增加了对Kotlin协同程序的支持。DAO方法现在可以 标记为挂起以确保它们不会在主服务器上执行 线

正如弗洛里娜·蒙特内斯库所说

DAO
get
方法应如下所示:

@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
}
您的ViewModel
getProduct
方法应该如下所示:

@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
}
现在,为了调用ViewModel
getProduct
方法,您应该在活动内部启动一个协同程序,如下所示:

@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:[]。给我这个