【Kotlin/Room】@TypeConverterでDate型などを保存する方法!

この記事からわかること

  • Android Studio/KotlinRoomデータベース使い方
  • サポート対象外データ型保存する方法
  • Date(日付)を保持するには?
  • @TypeConverter実装方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

参考文献:公式リファレンス:Room を使用して複雑なデータを参照する

環境

Roomで保存できるデータ型

Roomで保存できるデータ型はStringIntBooleanなどの基本的なデータ型はサポートされていますが、DateURL、独自のカスタムクラスなどはサポートされていないため保存することはできません


@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エンティティクラスの定義を変更する必要はありません。

  1. TypeConverterクラスの作成
  2. 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型として扱うことができるようになります。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index