RoomでDate型を扱うときにコツがいるのを知ったのでそれをまとめていきます(ちなみに、めっちゃ簡単でした)
この記事で分かること
- RoomでDate型を使用する方法
- 日本時間に合わせ、「2022/05/22(日)」のようなスタイルでDateを表示する方法
実際にやってみる
このようなメモアプリの一覧画面で実際に説明していこうと思います。
※コードは必要な部分だけを取り上げていきます。
Before
以下のように作成日時を Date 型で持つようなMemoエンティティを作成したところ、動きませんでした…。どうやらRoomでは Date をそのまま扱えないようです。
Memo.kt
@Entity(tableName = "memo")
data class Memo(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
@ColumnInfo(name = "title")
val memoTitle: String,
@ColumnInfo(name = "created_at")
val createdAt: Date
)
(MemoDatabase も後で改善するので、この段階で登場させてます)
MemoDatabase.kt(Before)
@Database(entities = [Memo::class], version = 1, exportSchema = false)
abstract class MemoDatabase : RoomDatabase() {
abstract fun memoDao(): MemoDao
}
After:@TypeConverter ・ @TypeConverters を使用
以下の2点を行うだけでDateを使用できます
-
@TypeConverterを活用し、コンバータークラスを作成 - 定義したコンバータークラスをRoomが認識できるように、
@TypeConvertersをMemoDatabaseに追加
DateConverters.kt
class DateConverters {
@TypeConverter
fun fromTimestamp(value: Long?): Date? {
return value?.let { Date(it) }
}
@TypeConverter
fun dateToTimestamp(date: Date?) : Long? {
return date?.time
}
}
MemoDatabase.kt(After)
@Database(entities = [Memo::class], version = 1, exportSchema = false)
@TypeConverters(DateConverters::class) // ここを追加!!
abstract class MemoDatabase : RoomDatabase() {
abstract fun memoDao(): MemoDao
}
これだけでOKです!
ちなみに、Databaseにはこのような形で保存されています。(一部今回は使用していないので伏せました)

おまけ:SimpleDateFormatを活用して作成日時を画面に表示
ついでに日本時間に合わせ、「2022/05/22(日)」のようなスタイルで画面に表示して確認してみましょう。
ここも少し工夫が必要です。
fun bind(memo: Memo) {
// フォーマットを設定
val sdf = SimpleDateFormat("yyyy/MM/dd(EEE)", Locale.JAPAN)
// タイムゾーンを設定
sdf.timeZone = TimeZone.getTimeZone("Asia/Tokyo")
binding.apply {
memoTitle.text = memo.memoTitle
// フォーマットを適用
dateText.text = sdf.format(memo.updatedAt)
}
}
結論
- RoomでDate型を使用するには…
- @TypeConverter でコンバータークラスを作成
-
@TypeConverters を
xxDatabaseに追加
- 日本時間に合わせ、「2022/05/22(日)」のようなスタイルでDateを表示する方法
-
SimpleDateFormat("yyyy/MM/dd(EEE)", Locale.JAPAN)でフォーマットを設定 -
TimeZone.getTimeZone("Asia/Tokyo")を使用し、タイムゾーンを設定 -
formatで適用
-
参考資料
おわりに
ここまで読んでいただき、ありがとうございました!
何かありましたら、コメントをお願いいたします。
