경험의 기록

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는 비동기로 동작하면서 여러개의 값을 반환하는 함수에서 사용한다.

Flowsuspend 를 적을 필요가 없으며 코루틴에서만 실행된다.

 

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

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading