【Kotlin/Room】@TypeConverterでDate型などを保存する方法!
この記事からわかること
- Android Studio/KotlinでRoomデータベースの使い方
- サポート対象外のデータ型を保存する方法
- Date(日付)を保持するには?
- @TypeConverterの実装方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
参考文献:公式リファレンス: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
型として扱うことができるようになります。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。