👇 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에 넣을것임
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()
}
}
implementation 'com.google.code.gson:gson:2.9.0' // gson
@TypeConverter
annotation을 통해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
}
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(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)
를 추가해줘야한다 ‼️