2021.05.20 - [안드로이드/AAC, MVVM] - [Android] Room 활용하여 데이터 읽기, 삽입, 삭제, 수정 - (2) 수정, 삭제
[Android] Room 활용하여 데이터 읽기, 삽입, 삭제, 수정 - (2) 수정, 삭제
2021.05.19 - [안드로이드/AAC, MVVM] - [Android] Room 활용하여 데이터 읽기, 삽입, 삭제, 수정 - (1) [Android] Room 활용하여 데이터 읽기, 삽입, 삭제, 수정 - (1) 2021.05.13 - [안드로이드/AAC, MVVM] - [A..
hanyeop.tistory.com
에서 작성한 코드를 바탕으로 합니다.
사용해보기
서치 메뉴 만들기
Vector Asset에서 search 아이콘을 하나만들어주고,
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/menu_search"
android:title="Search"
android:icon="@drawable/ic_baseline_search_24"
android:iconTint="@color/white"
app:showAsAction="ifRoom"
tools:targetApi="o"
app:actionViewClass="androidx.appcompat.widget.SearchView" />
</menu>
메뉴 레이아웃을 하나 만들어준다.
검색 메소드 추가
Dao
@Query("SELECT * FROM user_table ORDER BY id ASC")
fun readAllData() : Flow<List<User>>
@Query("SELECT * FROM user_table WHERE name LIKE :searchQuery")
fun searchDatabase(searchQuery : String) : Flow<List<User>>
Dao에서 searchDatabase를 추가해준다.
쿼리문으로 LIKE 를 사용하여 검색할 것이다.
또한 여기서 기존에 LiveData 로 리턴하던 것을 Flow 로 바꿔주었다.
Flow 는 비동기로 동작하면서 여러개의 값을 반환하는 함수에서 사용한다.
Flow 는 suspend 를 적을 필요가 없으며 코루틴에서만 실행된다.
Repository
val readAllData : Flow<List<User>> = userDao.readAllData()
fun searchDatabase(searchQuery: String): Flow<List<User>> {
return userDao.searchDatabase(searchQuery)
}
동일하게 추가해주고,
ViewModel
readAllData = repository.readAllData.asLiveData()
fun searchDatabase(searchQuery: String): LiveData<List<User>> {
return repository.searchDatabase(searchQuery).asLiveData()
}
메인에서 뷰모델의 데이터를 관찰할 때, 라이브데이터 형식으로 관찰하므로 asLiveData로 캐스팅해준다.
서치뷰 생성, 인터페이스
// 서치뷰 생성
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
}
아까 만들어준 서치뷰를 생성해주고, 인터페이스를 설정해주는데 여기서 액티비티에서 리스너를 상속받을 것이기 때문에 this로 본인을 지정해준다.
class MainActivity : AppCompatActivity(), CustomDialogInterface, SearchView.OnQueryTextListener{
override fun onQueryTextSubmit(query: String?): Boolean {
// 서치뷰 검색버튼 클릭 시
return true
}
override fun onQueryTextChange(newText: String?): Boolean {
// 서치뷰 텍스트 변경 시
if(newText != null){
searchDatabase(newText)
}
return true
}
SearchView.OnQueryTextListener를 상속받아서 두 메소드를 구현해준다.
private fun searchDatabase(query: String) {
val searchQuery = "%$query%"
userViewModel.searchDatabase(searchQuery).observe(this, {
adapter.setData(it)
})
}
텍스트가 바뀔때마다 호출되어 리스트를 변경시켜준다.
문자열 양 옆에 %를 사용함으로써 그 문자가 포함되어 있는가? 라는 의미를 가진다.
위 상단에 검색창이 추가된 것을 확인할 수 있으며
a 입력시 a가 포함된 데이터만 보여진다.
https://github.com/HanYeop/AndroidStudio-Practice/tree/master/RoomEx
HanYeop/AndroidStudio-Practice
(~2021.05.20) 안드로이드 학습 내용 저장소. Contribute to HanYeop/AndroidStudio-Practice development by creating an account on GitHub.
github.com
참고
https://www.youtube.com/watch?v=rn53Roy-HgE&list=PLSrm9z4zp4mEPOfZNV9O-crOhoMa0G2-o&index=10