【Kotlin/Room】@TypeConverterでDate型などを保存する方法!
この記事からわかること
- Android Studio/KotlinでRoomデータベースの使い方
- サポート対象外のデータ型を保存する方法
- Date(日付)を保持するには?
- @TypeConverterの実装方法
index
[open]
\ アプリをリリースしました /
参考文献:公式リファレンス:Room を使用して複雑なデータを参照する
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
Roomで保存できるデータ型
Roomで保存できるデータ型はStringやInt、Booleanなどの基本的なデータ型はサポートされていますが、DateやURL、独自のカスタムクラスなどはサポートされていないため保存することはできません。
@Entity(tableName = "user_table")
data class User(
@PrimaryKey(autoGenerate = true) val id: Int,
val name: String,
val age: Int,
val cratedAt: Date // ビルド時にエラーになる
)
しかしDate型などよく使用するものを保存できないのは使いづらいので、保存できるようにRoomから@TypeConverterを活用して実装する方法が紹介されていました。
@TypeConverterでDate型を保存する方法
Date型を保存できるようにするためには以下のステップで実装していきます。また先ほどのUserエンティティクラスの定義を変更する必要はありません。
- TypeConverterクラスの作成
- Databaseクラスに設定
1.TypeConverterクラスの作成
サポートされていないデータ型を保存するための仕組み部分であるConvertersクラスを定義します。ここではDate型を渡された時にサポートされているLong型に変換するためのロジックを記述します。
保存できるようにする仕組みは「サポート外のデータ型をサポート対象のデータ型に内部変換する」ということになります。なので相互に変換するためのメソッドを定義しておきます。
class Converters {
@TypeConverter
fun fromTimestamp(value: Long?): Date? {
return value?.let { Date(it) }
}
@TypeConverter
fun dateToTimestamp(date: Date?): Long? {
return date?.time?.toLong()
}
}
2.Databaseクラスに設定
Convertersクラスを定義したらRoomDatabaseに反映させる必要があるので定義したDatabaseクラスに@TypeConverters(Converters::class)の1行を追加します。
@Database(entities = [User::class], version = 1)
@TypeConverters(Converters::class) // 追記
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
これでサポート対象外のデータ型を保存する実装は完了です。
取得や新規作成時の挙動
途中にも記述しましたが、@TypeConverterを設定したことによりDate型の定義のままでもビルド時にエラーが発生しなくなります。
@Entity(tableName = "user_table")
data class User(
@PrimaryKey(autoGenerate = true) val id: Int,
val name: String,
val age: Int,
val cratedAt: Date // ビルド時にエラーにならなくなる
)
定義自体がDate型のままなので新規追加時やデータ取得時もDate型として扱うことができるようになります。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。






