LoginSignup
6
4

More than 1 year has passed since last update.

【Kotlin】RoomでDateを扱う方法(ついでにSimpleDateFormatを使って表示)

Posted at

RoomでDate型を扱うときにコツがいるのを知ったのでそれをまとめていきます(ちなみに、めっちゃ簡単でした)

この記事で分かること

  • RoomでDate型を使用する方法
  • 日本時間に合わせ、「2022/05/22(日)」のようなスタイルでDateを表示する方法

実際にやってみる

このようなメモアプリの一覧画面で実際に説明していこうと思います。
※コードは必要な部分だけを取り上げていきます。

Screenshot_20220522_030017.png

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を使用できます

  1. @TypeConverter を活用し、コンバータークラスを作成
  2. 定義したコンバータークラスをRoomが認識できるように、@TypeConvertersMemoDatabase に追加
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にはこのような形で保存されています。(一部今回は使用していないので伏せました)
スクリーンショット 2022-05-22 034434.jpg

おまけ: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型を使用するには…
  • 日本時間に合わせ、「2022/05/22(日)」のようなスタイルでDateを表示する方法
    • SimpleDateFormat("yyyy/MM/dd(EEE)", Locale.JAPAN) でフォーマットを設定
    • TimeZone.getTimeZone("Asia/Tokyo") を使用し、タイムゾーンを設定
    • format で適用

参考資料

おわりに

ここまで読んでいただき、ありがとうございました!
何かありましたら、コメントをお願いいたします。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4