[Kotlin] Room을 사용한 알림 설정 저장

Boknami·2023년 8월 27일
0

코틀린

목록 보기
10/19

사용자가 받고 싶은 알림을 체크 형태로 제공하는데, 체크 해놓은 사항이 지속적으로 저장되어 반영되어야 할 것이다. 이를 위해서 Room DB를 사용했다.

수정 : 생각해보니 여기에 각자가 적어둔 가이드라인까지 붙이면 더 좋은 효율을 발휘할 것 같다!!

🔎 첫 진입 시 DB는?

첫 진입 액티비티에서 다음 로직을 처리한다!
getAllData을 통해 DB에 저장된 값을 가져오는데 이게 비어있다면 초기화 하는 코드를 작성한다.

그리고 중요한 건 메인스레드는 UI처리를 해야하기에 코루틴을 이용해 비동기 처리로 실행한다!

CoroutineScope(Dispatchers.IO).launch {
            val existingData = dataRepository.getAllData()
            if (existingData.isEmpty()) {
                dataRepository.insertInitialData()
            }
}

📌 DB데이터를 이용해 체크 리스트 보여주기

DB에 저장된 ischecked의 값을 가져와서 DataList에 값을 수정해주고 수정된 값을 어댑터에 달아서 보내준다!

disasterRepository = DataRepository(AppDatabase.getDatabase(this).dataDao())

        CoroutineScope(Dispatchers.Main).launch {
            val isCheckedList = disasterRepository.getIsCheckedList()
            Log.d("재난", isCheckedList.toString())

            // DataList을 반복문을 통해 업데이트
            for (i in 0 until minOf(DataList.size, isCheckedList.size)) {
                DataList[i].ischecked = isCheckedList[i]
            }

            // DataList가 업데이트되었으므로 UI 요소를 설정
            binding = ActivitySetDisasterBinding.inflate(layoutInflater)
            var view = binding.root
            setContentView(view)

            binding.listview.adapter = ListViewAdapter(this@setDisasterActivity, DataList)

            binding.btnBack.setOnClickListener {
                super.onBackPressed()
            }
        }

📌 리스트뷰가 클릭 시 DB값 변경

어댑터의 getView쪽에 정의를 했고
클릭에 대한 리스너를 달아주고 체크 여부를 변경해 UI를 먼저 변경하고 변경된 UI 값을 이용해서 코루틴 속에서 DB값까지 변경해주는 모습이다!

view.setOnClickListener {
            // 아이템을 클릭하면 체크 상태를 토글합니다.
            DataList[position].ischecked =
                if (data.ischecked == 0) 1
                else 0

            val dataDao = AppDatabase.getDatabase(this.context).dataDao()
            val dataRepository = DataRepository(dataDao)

            CoroutineScope(Dispatchers.IO).launch {
                if(DataList[position].ischecked == 1){
                    dataRepository.updateIsCheckedValue(position+1, 1)
                }
                else{
                    dataRepository.updateIsCheckedValue(position+1, 0)
                }
                //Log.d("재난", "$position")
            }

            notifyDataSetChanged() // 어댑터에게 업데이트된 데이터를 알려줍니다.


        }

💻 결과화면

나갔다가 다시 들어와도 잘 된다.

0개의 댓글