房间数据库中的Android SearchView
数据库中的 SearchView 是一个非常基本的功能,您在日常生活中的大多数应用程序中都可以看到,那么为什么不呢,您应该学习并实现它。在您的应用程序中实现它并不太复杂。有很多更简单的方法可以用来实现它。您应该用来实现应用内搜索视图的任务是:-
- 您需要创建一个菜单项设置 actionViewClass 到 SearchView 并设置其他操作视图属性
- 然后在您想要搜索功能的操作的 onCreateOptionsMenu() 方法中扩充菜单。
- 然后从菜单中获取 SearchView 对象并通过调用 setOnQueryTextListener 方法向其添加 SearchView.OnQueryTextListener 。
- SearchView.OnQueryTextListener 有两个回调方法 onQueryTextSubmit 和 onQueryTextChange
- 当用户通过点击搜索小部件上的输入按钮或点击提交按钮提交搜索时,将调用 onQueryTextSubmit 方法。
在此方法中,可以使用输入到搜索视图小部件中的文本执行数据库搜索。您可以通过调用 setSubmitButtonEnabled 方法并传递布尔值 true 来启用搜索视图小部件中的搜索按钮。这是一个基本的想法,它是如何工作的。但是我们将讨论从房间数据库中搜索数据的最有效方法,为此,您应该了解一些概念,例如:
先决条件:
- 如何使用房间数据库在 recyclerView 中显示数据(什么是适配器)
- 什么是 ROOM 数据库(库)
- 熟悉Model-View-ViewModel架构(MVVM)
- 最重要的一个是依赖注入(dagger hilt)
除此之外,我们不会从头开始创建应用程序,我们将提供初始内容的源代码,例如
- 通过数据库更新 RecyclerView 中的数据
- 使用依赖注入
- 并创建了一些额外的类
我们正在为您提供该项目的快速概述,然后您将很容易理解它。单击此处下载项目。
分步实施
第 1 步:从 GitHub 下载项目并将其添加到您的 android studio
我们希望你们都知道如何将现有项目导入 android studio 如果没有然后转到文件 > 打开 > 选择下载的项目 > 然后等待...完成项目构建
第 2 步:build.Gradle 文件
导航到 app > Gradle Scripts > build.Gradle 文件并在依赖项部分添加以下依赖项。
- 我们添加了一些依赖项和插件
- 并启用视图绑定
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt' // dagger hilt plugin
id 'dagger.hilt.android.plugin'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.2"
defaultConfig {
applicationId "com.example.searchViewInRoom"
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
// here we have enabled viewBinding
buildFeatures {
viewBinding true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.13.1'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
// Navigation Component
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.2'
// Room components
implementation "androidx.room:room-runtime:2.2.6"
kapt "androidx.room:room-compiler:2.2.6"
implementation "androidx.room:room-ktx:2.2.6"
androidTestImplementation "androidx.room:room-testing:2.2.6"
// Dagger - Hilt
implementation "com.google.dagger:hilt-android:2.28.3-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.28.3-alpha"
implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02"
kapt "androidx.hilt:hilt-compiler:1.0.0-alpha02"
// Lifecycle
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
}
第 3 步:创建实体/表
转到应用 > 主 > searchViewInRoom > 数据 > person.kt。这就是我们如何使用 room 在 SQLite 数据库中创建实体/表
Kotlin
package com.example.searchViewInRoom.data
import androidx.room.Entity
import androidx.room.PrimaryKey
// it's our data class that we have
// annotate @Entity to create it as table
@Entity(tableName = "person_table")
data class Person(
// table is basically
// having 3 fields as follow....
var firstName: String,
var lastName: String,
var age: Int
){
@PrimaryKey(autoGenerate = true)
// we make id as primary
// key and it will autogenerate
var id: Int = 0
}
Kotlin
package com.example.searchViewInRoom.data
import androidx.room.Database
import androidx.room.RoomDatabase
// it's our database and here we
// specify entities, our version and exportSchema
@Database(
entities = [Person::class],
version = 1,
exportSchema = false
)
// in our database we have just extended RoomDatabase class
abstract class PersonDatabase: RoomDatabase() {
// as you can see it is our abstract fun and
// it represent our Data Access Object (dao)
abstract fun personDao(): PersonDao
}
Kotlin
package com.example.searchViewInRoom.di
import android.content.Context
import androidx.room.Room
import com.example.searchViewInRoom.data.PersonDatabase
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ApplicationComponent
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Singleton
// this is a very important step actually
// here we used dependency injection library dagger hilt
// it actually provide our database object and dao
@Module
@InstallIn(ApplicationComponent::class)
object DatabaseModule {
@Singleton
@Provides
fun provideDatabase(
@ApplicationContext context: Context
) = Room.databaseBuilder(
context,
PersonDatabase::class.java,
"person_database"
).build()
@Singleton
@Provides
fun provideDao(database: PersonDatabase) = database.personDao()
}
Kotlin
package com.example.searchViewInRoom.data
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import kotlinx.coroutines.flow.Flow
// here we have our Dao having three
// different queries as follows.....
@Dao
interface PersonDao {
// it's basically for reading our database
@Query("SELECT * FROM person_table ORDER BY id ASC")
fun readData(): Flow>
// it's for inserting person object to our database
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertData(person: Person)
// it's very important one for this article because
//it's a query for searching our database
/*
so here we have written basic sql query for searching our database
basically will search from our person table or entity
where our first name and last name contains some characters from our searchquery
*/
@Query("SELECT * FROM person_table WHERE firstName LIKE :searchQuery OR lastName LIKE :searchQuery")
// and then search query will be passed through
// the perimeter of this function
// and then function will return the flow of list of person
fun searchDatabase(searchQuery: String): Flow>
}
Kotlin
package com.example.searchViewInRoom.data
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject
// it's repository
/*
here we have basically injected our person Dao for our dao interface
and having three function as well........ */
class Repository @Inject constructor(
private val personDao: PersonDao
) {
fun readData(): Flow> {
return personDao.readData()
}
suspend fun insertData(person: Person) {
personDao.insertData(person)
}
fun searchDatabase(searchQuery: String): Flow> {
return personDao.searchDatabase(searchQuery)
}
}
Kotlin
package com.example.searchViewInRoom.viewmodel
import androidx.hilt.lifecycle.ViewModelInject
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import com.example.searchViewInRoom.data.Person
import com.example.searchViewInRoom.data.Repository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
// here we have our viewModel
// and we are going to use it for receiving
// and observing data from our database
class MainViewModel @ViewModelInject constructor(
private val repository: Repository
) : ViewModel() {
val readData = repository.readData().asLiveData()
fun insertData(person: Person){
viewModelScope.launch(Dispatchers.IO) {
repository.insertData(person)
}
}
fun searchDatabase(searchQuery: String): LiveData> {
return repository.searchDatabase(searchQuery).asLiveData()
}
}
XML
XML
XML
Kotlin
package com.example.searchViewInRoom
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.widget.Toast
import androidx.activity.viewModels
import androidx.appcompat.widget.SearchView
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.searchViewInRoom.adapter.MyAdapter
import com.example.searchViewInRoom.data.Person
import com.example.searchViewInRoom.databinding.ActivityMainBinding
import com.example.searchViewInRoom.viewmodel.MainViewModel
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class MainActivity : AppCompatActivity(){
// as you can see this is my main activity and
// here we have created view binding for binding our views
private lateinit var binding: ActivityMainBinding
// here we have initialized our mainViewModel
private val mainViewModel: MainViewModel by viewModels()
// and recycler view adapter
private val myAdapter: MyAdapter by lazy { MyAdapter() }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// here we are using linear layout manager for our recyclerView
binding.recyclerView.layoutManager = LinearLayoutManager(this)
// here we are setting my recyclerView
// to custom adapter that we have already made
binding.recyclerView.adapter = myAdapter
// here we are observing data by mainViewModel
// using readData variable
mainViewModel.readData.observe(this, {
// using custom recyclerView adapter we have
// set the data to our recycler view
myAdapter.setData(it)
})
}
}
Kotlin
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main_menu, menu)
val search = menu?.findItem(R.id.menu_search)
val searchView = search?.actionView as? SearchView
searchView?.isSubmitButtonEnabled = true
// here you get error but don't worry
searchView?.setOnQueryTextListener(this)
return true
}
Kotlin
package com.example.searchViewInRoom
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.widget.Toast
import androidx.activity.viewModels
import androidx.appcompat.widget.SearchView
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.searchViewInRoom.adapter.MyAdapter
import com.example.searchViewInRoom.data.Person
import com.example.searchViewInRoom.databinding.ActivityMainBinding
import com.example.searchViewInRoom.viewmodel.MainViewModel
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class MainActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
// as you can see this is my main activity and
// here we have created view binding for binding our views
private lateinit var binding: ActivityMainBinding
// here we have initialized our mainViewModel
private val mainViewModel: MainViewModel by viewModels()
// and recycler view adapter
private val myAdapter: MyAdapter by lazy { MyAdapter() }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// here we are using linear layout manager for our recyclerView
binding.recyclerView.layoutManager = LinearLayoutManager(this)
// here we are setting my recyclerView to
// custom adapter that i have already made
binding.recyclerView.adapter = myAdapter
// here we are observing data by mainViewModel
// using readData variable
mainViewModel.readData.observe(this, {
// using custom recyclerView adapter
// we have set the data to our recycler view
myAdapter.setData(it)
})
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main_menu, menu)
val search = menu?.findItem(R.id.menu_search)
val searchView = search?.actionView as? SearchView
searchView?.isSubmitButtonEnabled = true
searchView?.setOnQueryTextListener(this)
return true
}
Kotlin
override fun onQueryTextSubmit(query: String?): Boolean {
// it will triggered when
// we submit the written test
return true
}
// this function will triggered when we
// write even a single char in search view
override fun onQueryTextChange(query: String?): Boolean {
if(query != null){
searchDatabase(query)
}
return true
}
// We have just created this function for searching our database
private fun searchDatabase(query: String) {
// %" "% because our custom sql query will require that
val searchQuery = "%$query%"
mainViewModel.searchDatabase(searchQuery).observe(this, { list ->
list.let {
myAdapter.setData(it)
}
})
Kotlin
fun additem(view: android.view.View) {
mainViewModel.insertData(Person("Krish", "joshi", 18))
mainViewModel.insertData(Person("Sukant", "desai", 38))
mainViewModel.insertData(Person("Anye", "jems", 40))
mainViewModel.insertData(Person("Geek", "geek", 76))
mainViewModel.insertData(Person("Alok", "pro", 45))
mainViewModel.insertData(Person("Kushi", "singh", 34))
mainViewModel.insertData(Person("Final", "step", 23))
mainViewModel.insertData(Person("Vidyut", "sharma", 20))
mainViewModel.insertData(Person("Ankit", "chaudhary", 19))
mainViewModel.insertData(Person("Abhay", "yadav", 16))
}
第 4 步:创建数据库
转到应用程序 > 主 > searchViewInRoom > 数据 > personDatabase.kt。这就是您可以创建数据库的方式。请阅读评论以获得更好的理解。
科特林
package com.example.searchViewInRoom.data
import androidx.room.Database
import androidx.room.RoomDatabase
// it's our database and here we
// specify entities, our version and exportSchema
@Database(
entities = [Person::class],
version = 1,
exportSchema = false
)
// in our database we have just extended RoomDatabase class
abstract class PersonDatabase: RoomDatabase() {
// as you can see it is our abstract fun and
// it represent our Data Access Object (dao)
abstract fun personDao(): PersonDao
}
第五步:数据库模块类
转到 app > main > searchViewInRoom > di > DatabaseModule.kt。这里我们使用依赖注入
科特林
package com.example.searchViewInRoom.di
import android.content.Context
import androidx.room.Room
import com.example.searchViewInRoom.data.PersonDatabase
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ApplicationComponent
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Singleton
// this is a very important step actually
// here we used dependency injection library dagger hilt
// it actually provide our database object and dao
@Module
@InstallIn(ApplicationComponent::class)
object DatabaseModule {
@Singleton
@Provides
fun provideDatabase(
@ApplicationContext context: Context
) = Room.databaseBuilder(
context,
PersonDatabase::class.java,
"person_database"
).build()
@Singleton
@Provides
fun provideDao(database: PersonDatabase) = database.personDao()
}
第 6 步:Dao(数据访问对象)类
转到应用程序 > 主 > searchViewInRoom > 数据 > personDao.kt
科特林
package com.example.searchViewInRoom.data
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import kotlinx.coroutines.flow.Flow
// here we have our Dao having three
// different queries as follows.....
@Dao
interface PersonDao {
// it's basically for reading our database
@Query("SELECT * FROM person_table ORDER BY id ASC")
fun readData(): Flow>
// it's for inserting person object to our database
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertData(person: Person)
// it's very important one for this article because
//it's a query for searching our database
/*
so here we have written basic sql query for searching our database
basically will search from our person table or entity
where our first name and last name contains some characters from our searchquery
*/
@Query("SELECT * FROM person_table WHERE firstName LIKE :searchQuery OR lastName LIKE :searchQuery")
// and then search query will be passed through
// the perimeter of this function
// and then function will return the flow of list of person
fun searchDatabase(searchQuery: String): Flow>
}
步骤 7:创建存储库类
转到应用程序 > 主 > searchViewInRoom > 数据 > Repository.kt
科特林
package com.example.searchViewInRoom.data
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject
// it's repository
/*
here we have basically injected our person Dao for our dao interface
and having three function as well........ */
class Repository @Inject constructor(
private val personDao: PersonDao
) {
fun readData(): Flow> {
return personDao.readData()
}
suspend fun insertData(person: Person) {
personDao.insertData(person)
}
fun searchDatabase(searchQuery: String): Flow> {
return personDao.searchDatabase(searchQuery)
}
}
第 8 步:主视图模型
转到 app > main > searchViewInRoom>viewmodel > MainViewModel.kt。我们将使用这个模块来接收和观察来自数据库的数据。
科特林
package com.example.searchViewInRoom.viewmodel
import androidx.hilt.lifecycle.ViewModelInject
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import com.example.searchViewInRoom.data.Person
import com.example.searchViewInRoom.data.Repository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
// here we have our viewModel
// and we are going to use it for receiving
// and observing data from our database
class MainViewModel @ViewModelInject constructor(
private val repository: Repository
) : ViewModel() {
val readData = repository.readData().asLiveData()
fun insertData(person: Person){
viewModelScope.launch(Dispatchers.IO) {
repository.insertData(person)
}
}
fun searchDatabase(searchQuery: String): LiveData> {
return repository.searchDatabase(searchQuery).asLiveData()
}
}
上面提到的所有这些类都已经在您下载的项目中,这是一个快速概览。现在让我们转到给定项目的 XML 部分……
activity_main.xml 文件
现在我们必须导航到app > res > activity_main.xml并理解以下代码。
XML
row_layout.xml 文件
这是一个项目视图,我们必须添加到 RecyclerView
XML
这就是我给你的整个项目,之后你的应用程序应该是这样的......
但是如果给定的列表显示得很好,否则别担心,我们会管理它。现在让我们开始文章的真正部分(SearchView 的实现)。这里只有三个步骤来实现您的搜索功能,如下所示……
- 在屏幕上的任意位置添加搜索图标
- 覆盖 onCreateOptionsMenu() 方法
- 然后在我们的 mainActivity 中实现 onQueryTextListner
就是这样。所以让我们去做吧。
第 1 步:在屏幕上的任意位置添加搜索图标
我们将它添加到应用程序的右上角。为此,您必须通过资源管理器 > 菜单 > 添加菜单资源文件来创建菜单项
XML
第 2 步:覆盖 onCreateOptionsMenu() 方法
转到 MainActivity.kt。它已经有一些代码,但请阅读我在那里提到的评论,您也可以轻松理解它。
科特林
package com.example.searchViewInRoom
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.widget.Toast
import androidx.activity.viewModels
import androidx.appcompat.widget.SearchView
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.searchViewInRoom.adapter.MyAdapter
import com.example.searchViewInRoom.data.Person
import com.example.searchViewInRoom.databinding.ActivityMainBinding
import com.example.searchViewInRoom.viewmodel.MainViewModel
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class MainActivity : AppCompatActivity(){
// as you can see this is my main activity and
// here we have created view binding for binding our views
private lateinit var binding: ActivityMainBinding
// here we have initialized our mainViewModel
private val mainViewModel: MainViewModel by viewModels()
// and recycler view adapter
private val myAdapter: MyAdapter by lazy { MyAdapter() }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// here we are using linear layout manager for our recyclerView
binding.recyclerView.layoutManager = LinearLayoutManager(this)
// here we are setting my recyclerView
// to custom adapter that we have already made
binding.recyclerView.adapter = myAdapter
// here we are observing data by mainViewModel
// using readData variable
mainViewModel.readData.observe(this, {
// using custom recyclerView adapter we have
// set the data to our recycler view
myAdapter.setData(it)
})
}
}
理解了上面的代码后,只要得到override onCreateOptionsMenu()
- 获取只需按 ctrl+o 并搜索此函数然后按 Enter
- 我们必须覆盖这个函数,以便我们可以在此处添加我们的菜单,如下所示。
科特林
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main_menu, menu)
val search = menu?.findItem(R.id.menu_search)
val searchView = search?.actionView as? SearchView
searchView?.isSubmitButtonEnabled = true
// here you get error but don't worry
searchView?.setOnQueryTextListener(this)
return true
}
在第 2 步之后,您的主要活动将如下所示……
科特林
package com.example.searchViewInRoom
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.widget.Toast
import androidx.activity.viewModels
import androidx.appcompat.widget.SearchView
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.searchViewInRoom.adapter.MyAdapter
import com.example.searchViewInRoom.data.Person
import com.example.searchViewInRoom.databinding.ActivityMainBinding
import com.example.searchViewInRoom.viewmodel.MainViewModel
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class MainActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
// as you can see this is my main activity and
// here we have created view binding for binding our views
private lateinit var binding: ActivityMainBinding
// here we have initialized our mainViewModel
private val mainViewModel: MainViewModel by viewModels()
// and recycler view adapter
private val myAdapter: MyAdapter by lazy { MyAdapter() }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// here we are using linear layout manager for our recyclerView
binding.recyclerView.layoutManager = LinearLayoutManager(this)
// here we are setting my recyclerView to
// custom adapter that i have already made
binding.recyclerView.adapter = myAdapter
// here we are observing data by mainViewModel
// using readData variable
mainViewModel.readData.observe(this, {
// using custom recyclerView adapter
// we have set the data to our recycler view
myAdapter.setData(it)
})
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main_menu, menu)
val search = menu?.findItem(R.id.menu_search)
val searchView = search?.actionView as? SearchView
searchView?.isSubmitButtonEnabled = true
searchView?.setOnQueryTextListener(this)
return true
}
第三步:在 MainActivity.kt 中实现 onQueryTextListner
在主要活动中实现您的 setOnQueryTextListener 以将“this”作为边界传递
- 对于实现,只需在 MainActivity 类之后添加 SearchView.OnQueryTextListener :AppCompatActivity() 就像......。类 MainActivity : AppCompatActivity(), SearchView.OnQueryTextListener
- 在显示另一个错误后,只需将光标移动到错误处并按 alt+Enter
- 那么你将有两个名为 onQueryTextChange() 和 onQueryTextChange() 的函数
- 然后只需将这两个功能实现为
科特林
override fun onQueryTextSubmit(query: String?): Boolean {
// it will triggered when
// we submit the written test
return true
}
// this function will triggered when we
// write even a single char in search view
override fun onQueryTextChange(query: String?): Boolean {
if(query != null){
searchDatabase(query)
}
return true
}
// We have just created this function for searching our database
private fun searchDatabase(query: String) {
// %" "% because our custom sql query will require that
val searchQuery = "%$query%"
mainViewModel.searchDatabase(searchQuery).observe(this, { list ->
list.let {
myAdapter.setData(it)
}
})
是的!我们已经成功实现了搜索功能。你可以点击这里下载最终的源代码。
现在运行您的应用程序并查看。您的应用程序是否在回收站视图中显示虚拟数据?如果是,那么您现在已经完成了,您可以搜索某些内容,它会显示结果,
但是,如果不这样做,则使用一些步骤添加一些虚拟数据,例如……
- 在 MainActivity.kt 类中创建一个类似“fun additem()”的函数
- 然后使用 mainViewModel.insertData(Person("字符串 : name", "字符串: lastname", int :age)) 插入数据,如下代码所示
- 现在只需在单击浮动操作按钮时调用 additem()函数,或者根据需要调用。
科特林
fun additem(view: android.view.View) {
mainViewModel.insertData(Person("Krish", "joshi", 18))
mainViewModel.insertData(Person("Sukant", "desai", 38))
mainViewModel.insertData(Person("Anye", "jems", 40))
mainViewModel.insertData(Person("Geek", "geek", 76))
mainViewModel.insertData(Person("Alok", "pro", 45))
mainViewModel.insertData(Person("Kushi", "singh", 34))
mainViewModel.insertData(Person("Final", "step", 23))
mainViewModel.insertData(Person("Vidyut", "sharma", 20))
mainViewModel.insertData(Person("Ankit", "chaudhary", 19))
mainViewModel.insertData(Person("Abhay", "yadav", 16))
}
- 如果要使用浮动操作按钮插入数据
- 然后只需将此行添加到您的浮动操作按钮代码中
android:onClick=”additem”
就是这样,您的数据也将显示在您的应用程序中,现在您还可以检查搜索……。最后,该应用程序正在运行
输出: