마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

converter인데, 이런 형태로 저장하고 꺼내올 수 있나요?

0 추천
object Converters2 {
    //DB에서 꺼낼 때
    @TypeConverter
    @JvmStatic
    fun fromString(value:String):ArrayList<ArrayList<String>> {
        val listType = object: TypeToken<ArrayList<ArrayList<String>>>() {}.getType()
        return Gson().fromJson(value, listType)
    }
    //DB에 저장할 때
    @TypeConverter
    @JvmStatic
    fun fromArrayList(list:ArrayList<ArrayList<String>>) : String {
        val gson = Gson()
        val json = gson.toJson(list)
        return json
    }
}

이렇게 코드를 짜긴 했는데, 

ArrayList<ArrayList<String>>

이 부분이 잘 작동 하려나 모르겠네요.

 

이제 거의 막바지라, 하이라이트 기능 만들고 있는데, 이게 여태한 것 중에

제일 어려운것 같아요... 각 장마다 일일이 다 저장해야 하니까, 페이지도 엄청난데...

DB로 꺼냈다 넣었다하면 오래걸릴까봐, 2차원 배열로 꺼내서 변수에 담아놓고 참조하다가,

작업 다 마치면, 2차원 배열로 다시 DB에 저장하려고 하거든요.

아니면, 3차원 배열로 할까 생각중이에요. 2차원은 별로 효과 없을것 같아서..

[장0..n] [하이라이트, 절, 기타등등0..3] [절0...n]

 

이게 좀 복잡한게, onBindViewHolder()에서

SparseBooleanArray(0)

얘랑 또 엮어서 뷰 속성 중복 안되게 해줘야 하고, 많이 어려운것 같아요.

또, 리사이클러뷰 어댑터 초기화 시켜줄때, DB에서 정보 꺼내와야 하는데, 이게 또 타이밍이 서로 안맞습니다.. DB에서 정보 꺼내오는 동안에, 이미 리사이클러뷰는 초기화 된 후니까요, 인덱스0 사이즈0 오류나기 일수고요... 그래서 메인액티비티에서 3차원 배열에 미리 넣어놓고, 리딩액티비티로 전달해서 초기화시키고 뭐하고, 하려구요. 아... 너무 복잡해요...

 

규모가 너무 크니까, 하기 전에 미리 조언좀 얻으려고 여쭤봤습니다.

 

그래서 

//pause()때에 저장해주거나, 뒤로가기키를 누르면 저장해주거나, 
하이라이트 키를 누를때에 저장해주거나 하려고요.
Room DB는 pause()때에 저장해주기는 어려울까요?
스마트폰 전원 꺼질때 해봤는데, 저용량에서는 잘 작동 되더라구요. 
근데 용량 큰것도 가능한가 싶어서요.
 
코딩 방법을 어떻게 할까 고민이네요...
상쾌한 (1,890 포인트) 님이 2021년 10월 5일 질문
상쾌한님이 2021년 10월 5일 수정

1개의 답변

+1 추천
 
채택된 답변

Converter는 괜찮을 것처럼 보이네요.

그리고 DB를 읽는 것과 화면에 데이터를 보여주는 부분은 DB를 먼저 읽고나서 완료되면 리사이클러뷰를 업데이트 하시면 됩니다. 비동기작업이므로, LiveData, Coroutine, RxJava, Flow 중 하나를 이용해서 처리하시는게 일반적이예요.

이렇게 하시려면 ViewModel 이나 이런 곳에서 DAO를 읽어와서 동기화를 시키셔야 해요. 코틀린의 경우는 코루틴을 사용할 수 있기 때문에 DAO의 함수들을 suspend 키워드를 붙여서 suspend  함수로 만들고 ViewModel에서 아래처럼 ViewModel scope안에서 처리하면 자동으로 동기화를 해줍니다.

viewModelScope.launch(Dispachers.IO) {
      val dbData =  loadDataFromDb()
      val uiData = convderDbDataToUiData(dbData)
      liveData.postValue(dbData)
 }

 

spark (227,530 포인트) 님이 2021년 10월 5일 답변
상쾌한님이 2021년 10월 5일 채택됨
뭘 물어보고 싶어도, 코루틴에 대해서 잘 모르니까, 망설여지네요. 개발자 페이지 읽어봐야겠어요. 감사합니다.
단순히 DB에서 읽어와서 처리하는 정도의 코드는 코루틴으로 아주 쉽게 할 수 있습니다. 이 경우 다른 옵션들보다는 훨씬 간단합니다.
네, 알려주신것만 하면 되는건지, 아니면, 뭔가 더 필요한건지 잘 모르겠어요. 뷰모델이랑, 코루틴이랑 계속 미뤄왔던거라, 이제 공부 다시 해야할것 같아요. 어차피 이거 끝나면 또 다른 앱 만들거라서요. 감사합니다. ^^
...