房间数据库中的搜索功能

时间:2020-09-17 09:14:48

标签: android kotlin search mvvm

我想为我的用户创建一个搜索功能,以快速访问我的商品。

好吧,第一件事是我将我的产品放在一个房间表(列表)中,并将其存储在数据库中,并在我的主要活动(家庭活动)中以recyclerview进行展示。

因此,我希望在用户单击按钮搜索之后编写一个查询以在它们之间进行搜索的代码。

我对查询进行编码,并且在家庭活动中使用它后没有任何反应。我正在使用mvvm模型。请帮助我。

代码:

我的表(产品列表):

@Entity(tableName = "cart")
data class RoomTables(

    @PrimaryKey(autoGenerate = true) val id: Int?,
    @ColumnInfo val title: String,
    @ColumnInfo val price: Int,
    @ColumnInfo val image: Int,
    @ColumnInfo var amount: Int

)

我的岛:

    @Query ("SELECT * FROM cart WHERE title LIKE :search")
    fun searchItem (search : String?):List<RoomTables>

我的存储库:

  fun searchItem(search :String) = db.GetDao().searchItem(search)

我的Viewmodel:

    fun searchItem(search : String) = CoroutineScope(Dispatchers.Default).launch {


        repository.searchItem(search)


    }

和HomeActivity:


class HomeActivity : AppCompatActivity() {



    lateinit var viewModelRoom: ViewModelRoom

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.home_activity)


        val list = ArrayList<RoomTables>()

        for (i in 0..20) {

            list.add(
                RoomTables(
                    null, "$i banana", 12,
                    R.drawable.bannana, 0
                )
            )

        }


        recycler_main.apply {

            layoutManager = GridLayoutManager(this@HomeActivity, 2)
            adapter = RecyclerAdapterMain(list, context)

        }

        val database = DataBaseRoom(this)
        val repositoryCart = RepositoryCart (database)
        val factoryRoom = FactoryRoom(repositoryCart)


        viewModelRoom = ViewModelRoom(repositoryCart)
        viewModelRoom = ViewModelProvider(this , factoryRoom ).get(ViewModelRoom::class.java)

        val editText : EditText = findViewById(R.id.edittextSearch)
        val searchbtn : ImageView = findViewById(R.id.search_main)

        searchbtn.setOnClickListener{

            viewModelRoom.searchItem(editText.text.toString())

        }

1 个答案:

答案 0 :(得分:0)

让我们尝试这种方法。

首先从表格中获取列表项。

@Query ("SELECT * FROM cart")
fun searchItem():List<RoomTables>

现在从您的存储库中

fun searchItem() : List<RoomTables> = db.GetDao().searchItem()

在ViewModel中。

fun searchItem(search : String): <List<RoomTables> {
    filterWithQuery(query)
    return filteredList
}
    private fun filterWithQuery(query: String, repository: YourRepository) {
        val filterList = ArrayList<RoomTables>()
        for (currentItem: RoomTables in repository.searchItem()) {
            val formatTitle: String = currentItem.title.toLowerCase(Locale.getDefault())
            if (formatTitle.contains(query)) {
                filterList.add(currentItem)
            }
        }
        filteredList.value = filterList
    }

确保在上面添加Coroutines

现在,您已过滤所有元素,并根据输入的搜索查询用户返回新的列表项。

在您的片段或活动中观察数据。

searchbtn.setOnClickListener{
    viewModel.searchItem(query).observe(viewLifecycleOwner, Observer { items -> { 
        // Add data to your recyclerview
    }
}

流程和方法是正确的,并且可以正常工作,很难遵循您的代码,因为我不确定返回类型是否匹配,因为您没有使用LiveData,在这种情况下必须这样做。

如果您感到困惑或难以遵循,我在github中有一个有效的示例,请进行比较并进行更改。

https://github.com/RajashekarRaju/ProjectSubmission-GoogleDevelopers

相关问题