Room은 Date
객체를 유지하는 방법을 모르기 때문에 TypeConverter를 정의하여 Long
타입으로 변경하여 저장해야 한다.
class TypeConverters {
@TypeConverter
fun toLocalDateTime(timestamp: Long): LocalDateTime {
return Instant
.ofEpochMilli(timestamp)
.atZone(ZoneId.systemDefault())
.toLocalDateTime()
}
@TypeConverter
fun toTimestamp(date: LocalDateTime): Long {
return date.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()
}
}
위와 같이 TypeConverter를 정의하여 LocalDateTime → Long, Long → LocalDateTime으로 변환하는 방법을 알려주어야 한다.
하지만 LocalDate, LocalDateTime
클래스는 안드로이드 API level 26 이상부터 지원이 된다.
우리 프로젝트는 minSdk가 21이기 때문에 사용하기 위해서 모듈 수준의 build.gradle 파일을 수정할 필요가 있다.
우선 java.time
의 하위 클래스를 하위 버전에서 지원하기 위해서는 Android Gradle Plugin 버전이 4.0.0 이상이어야 한다.
android {
...
compileOptions {
isCoreLibraryDesugaringEnabled = true // LocalDateTime 이 Api 26 이하 지원을 위해서 추가함.
...
}
...
}
dependencies {
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.2.0")
...
}
coreLibraryDesugaring
은 Java 8 API를 지원하기 위해 해당 API의 구현을 포함하는 별도의 라이브러리 Dex 파일을 컴파일하고 이를 앱에 포함한다.
결국 앱의 APK 및 AAR의 용량은 조금 증가했지만, Java 8 API의 호환성을 얻게 된다.