firebase RealtimeDatabase에서 keyword로 쿼리하기

undefined·2023년 2월 19일
0

Android

목록 보기
2/3

얼마전 실시간 채팅 앱 개발을 하다가 만난 문제이다.
"firebase realtime database의 데이터를 keyword로 검색하게 해주세요"

기존 코드는 FirebaseRecyclerviewAdapter를 사용해서 구현해두었기 때문에 firebase ui api를 사용해서 구현하면 될 것 같았다.

하지만? equalTo, startXXX, startAfterXXX 이런 api만 제공했기에 내가 원하는 동작 구현이 되지 않았다.
구선생님의 도움을 받아 이것저것 찾아봤지만 답을 찾지 못했고, 결국 그냥 snapshot에서 keyword로 필터링하는 방식으로 구현했다.

이게 최선일까?ㅠㅠㅠ

아무튼!

        firebaseRef.addValueEventListener(object :ValueEventListener{
            override fun onDataChange(snapshot: DataSnapshot) {
                Log.d(TAG,"onchanged ${snapshot.value}")
                val list = arrayListOf<RoomInfo>()
                for (itemSnapshot in snapshot.children) {
                    val dataClass = itemSnapshot.child("roomInfo").getValue(RoomInfo::class.java)

                    if (dataClass != null && (viewModel.keyword.value.isNullOrBlank() || dataClass.name?.contains(viewModel.keyword.value?:"")?:false)) {
                        dataClass.let {
                            list.add(it)
                        }
                    }
                }
                viewModel.setRooms(list)
                adapter.submitList(list)
            }
        mBinding.search.setOnQueryTextListener(object : SearchView.OnQueryTextListener,
            androidx.appcompat.widget.SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(p0: String?): Boolean {
                Log.d(LLog.TAG,"onQueryTextSubmit ${p0}")
                return false
            }

            override fun onQueryTextChange(p0: String?): Boolean {
                Log.d(TAG,"onQueryTextChange ${p0}")
                if ((p0?:"").isEmpty())  adapter.submitList(viewModel.rooms.value)
                else adapter.submitList(viewModel.rooms.value?.filter { it.name?.lowercase()?.contains(p0?.lowercase() ?: "") ?: false })
                return true
            }
        })
    }

이렇게 구현했는데, 다른방법도 계속 생각해봐야겠다😂


아 그리고 추가로 검색컴포넌트 구현할 때 icon이 왼쪽에 있어서 어떻게 옮길까 했는데
android:layoutDirection="rtl"
로 한번에 해결됐다,,

또 searchview로 검색창 구현을 했는데, 기본값이 collaped여서 아이콘을 클릭해야 검색어 입력을 할 수 있어서
android:iconifiedByDefault="false"
로 항상 펼쳐져 있게 설정했다.

profile
이것저것 하고 싶은 게 많은 병아리 개발자

0개의 댓글