[Android] Room에 List 넣기 @TypeConverter / Cannot figure out how to save this field into database. You can consider adding a type converter for it.

구민지·2022년 7월 17일
0
post-thumbnail

👇 Room에서 List를 넣으려고 하니 아래와 같은 에러가 발생했다. 🤔

Cannot figure out how to save this field into database. You can consider adding a type converter for it.

List를 넣기위해 Converter를 추가하라는 얘기를 하는데, Room은 항목 클래스 간의 객체 참조를 허용하지 않는다. 대신 앱에 필요한 데이터를 명시적으로 요청해야 한다.

@TypeConverter 를 사용하는 방법과 Room에서 객체참조를 허용하지 않는 이유에 대해서는 @TypeConverter 안드로이드 공식문서 에서 확인이 가능하다 ✨

예제


👉 일정제목(String) , 일정설명(String) , 선택된날짜(List) 를 Room에 넣을것임

1. Converter class 파일

import androidx.room.TypeConverter
import com.google.gson.Gson

class DateListConverters {
    @TypeConverter
    fun listToJson(value: List<Date>?): String? {
        return Gson().toJson(value)
    }

    @TypeConverter
    fun jsonToList(value: String): List<Date>? {
        return Gson().fromJson(value,Array<Date>::class.java)?.toList()
    }
}
  • Gson을 추가해줘야한다 (build.gradle 모듈단위)
    implementation 'com.google.code.gson:gson:2.9.0' // gson
  • List를 바로 Room에 넣을 수 없음으로 @TypeConverter annotation을 통해
    List 👉 Json
    Json 👉 List
    상호변환 해준다

2. Entity, Dao, Database 파일을 만든다

💁‍♀️Entity

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity
data class NewSchedule(
    val title:String,
    val describe:String,
    val selectedDates:List<Date>
){
    @PrimaryKey(autoGenerate = true) var id:Int=0
}

💁‍♀️Dao


import androidx.room.*

@Dao
interface NewScheduleDao {
    @Insert
    fun insert(newSchedule: NewSchedule)

    @Update
    fun update(newSchedule: NewSchedule)

    @Delete
    fun delete(newSchedule: NewSchedule)

    @Query("SELECT * FROM NewSchedule")
    fun getAll() : List<NewSchedule>
}

💁‍♀️Database


@Database(entities = [NewSchedule::class],version = 1)
@TypeConverters(DateListConverters::class)
abstract class NewScheduleDatabase : RoomDatabase() {

    abstract fun newScheduleDao():NewScheduleDao

    companion object{
        private var instance : NewScheduleDatabase? = null
        @Synchronized
        fun getInstance(context: Context):NewScheduleDatabase?{
            if(instance==null){
                synchronized(NewScheduleDatabase::class){
                    instance= Room.databaseBuilder(
                        context.applicationContext,
                        NewScheduleDatabase::class.java,
                        "newSchedule-database" 
                    ).build()
                }
            }
            return instance
        }
    }
}

✨✨ Database 파일에서

@TypeConverters(DateListConverters::class)

를 추가해줘야한다 ‼️

0개의 댓글