エンジニア男

勉強したことの忘備録としてつらつら書いていきます。

【Android】RoomにDate型を登録する方法

RoomはDate型の登録は出来ないので、Long型に変換して登録する方法のメモ。

 

・公式ドキュメント

https://developer.android.com/training/data-storage/room/referencing-data?hl=ja

 

1, Entity

@Entity(tableName = "user_table")
data class User(
@Primarykey(autoGenerate = true)
val id: Int,
val word: String,
// Date型のプロパティを持つ
val createdDate: Date
)

 

 

2, 型変換用のクラスを作成する

class DateConverter {

// Long型をDate型に変換
@TypeConverter
fun fromDate(value: Long?): Date? {
return if (value == null) null else Date(value)
}

// Date型をLong型に変換
@TypeConverter
fun dateToLong(date: Date?): Long? {
return date?.let { it.time }
}

}

 

 

 

3, DBクラスに、型変換用のクラスを登録する。

@Database(entities = [Word::class], version = 1, exportSchema = false)
@TypeConverters(DateConverter::class)
abstract class UserDatabase: RoomDatabase() {
abstract fun userDao(): UserDao

companion object {
@Volatile
private var INSTANCE: UserDatabase? = null

fun getDatabase(context: Context): UserDatabase {
val tempInstance = INSTANCE
if (tempInstance != null) {
return tempInstance
}
synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
UserDatabase::class.java,
"user_database"
).build()
INSTANCE = instance
return instance
}
}
}



 

 

型変換用のクラスを作成し、DBクラスに@TypeConvertersで指定することで、Roomが対応していない型をString、Intなどの型に変換して保存し、取り出すときは逆にString、Intかた元の型に変換することで、RoomでData型などの型を扱えるようにする。

この方法で、独自クラスなどもRoomで扱えるようになる。