본문 바로가기

[UMC/Android] 8주차 - RoomDB 활용하기

@hyeon.s2022. 11. 23. 23:41

8주차 - RoomDB 활용하기

🍀구현영상 및 설명

  • 이전 주차에 bundle을 활용해서 Activity와 Fragment간 데이터를 전달했던 것을 모두 RoomDB로 바꾸어서 만들었다.
  • RoomDB를 활용해 메모 수정, 삭제, 추가 기능을 구현하였다.
    • 메모 리스트 RV에서 item 클릭시 해당 리스트의 메모 id를 받아오고 이를 매개변수로 활용해 각 메모를 수정 및 삭제 했다.
    • FrameLayout을 활용해 즐겨찾기 toggle를 구현하고, 보관함에 즐겨찾기 메모가 담기도록 하였다.
    • 사용한 각 Query는 다음과 같다.
@Dao
interface MemoDao {
    //메모 추가
    @Insert
    fun insert(memo:MemoData)

    @Delete
    fun delete(memo:MemoData)

    //메모 삭제 (memoId 이용)
    @Query ("DELETE FROM MemoData WHERE memoId=:memoId")
    fun deleteMemo(memoId:Int)

    // 메모 전체 불러오기
    @Query("SELECT * FROM MemoData")
    fun selectAllMemo() : MutableList<MemoData>

    // 특정 메모 불러오기 (memoId 이용)
    @Query("SELECT * FROM MemoData WHERE memoId=:memoId")
    fun selectOneMemo(memoId:Int) : MemoData

    //메모 내용 수정 및 즐겨찾기 변경 
    @Query("UPDATE MemoData SET title = :title, content = :content, day = :day, color = :color, favorite = :favorite WHERE memoId=:memoId")
    fun updateMemo(memoId:Int,title:String?,content:String?,day:String?,color:String?,favorite:Boolean)

    //좋아요 메모들만 가져오기
    @Query("SELECT * FROM MemoData WHERE favorite=:favorite")
    fun selectFavorite(favorite: Boolean) : MutableList<MemoData>
}

🍀코드

UMC_Android/week8 at master · ss99x2002/UMC_Android

🍀트러블슈팅

dataList 업데이트 문제

  • 문제 : RoomDB에서 Select, Delete, Update 등을 해서 가져온 List가 RecyclerView에 바로 적용되지 않는 문제가 발생했다.
  • 원인: RoomDB에서 리스트를 리턴 받을 때 List<> 자료형으로 받아서 List가 변경되었을때 처리를 못했던 것이다.
  • 해결: 리턴 값을 MutableList<>로 받아 set, removeAt 메서드 등을 이용해 List를 변경하고 notify하니 정상적으로 바로 적용되었다.

새로운 메모 추가 시 memo Id 리턴 문제

  • 현재 코드에서 메모 수정,삭제 등의 처리를 할때 memoId를 다른 activity로 전달하고, memoId를 통해 roomDB로 해당 메모의 데이터를 가져오는 Query를 작성했다.
  • 문제: 이미 생성된 메모의 경우 memoId를 받아와 처리 할 수 있지만, 새롭게 메모를 생성 할 경 수정 및 삭제가 어려운 문제가 발생했다.
  • 원인: insert 후 memoId를 리턴 할 방법이 없어서 해당 문제가 발생했다.
  • 해결: memoId만을 리턴하는 쿼리를 작성하려 했으나 제목, 내용 등 모든 값을 조건으로 다 입력해야 했기 때문에 다른 방법을 생각했다.
    • memoList에 마지막 메모의 id + 1 로 새로운 메모의 id를 부여해주었다.
      • 어차피 memoId는 자동으로 증가하기만 하기 때문에, list의 끝에 있는 값보다 더 큰 memoId는 리스트에 존재할 수 없기 때문이다.

 

hyeon.s
@hyeon.s :: 개발로그
목차