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
で適用
-
参考資料
おわりに
ここまで読んでいただき、ありがとうございました!
何かありましたら、コメントをお願いいたします。