개발일지

Android in A..Z - Room (TypeConvert) 본문

Android (안드로이드)/Room

Android in A..Z - Room (TypeConvert)

강태종 2021. 1. 17. 03:41

TypeConvert

Room에서 제공하는 자료형 제외한 다른 자료형을 저장할 때 사용한다.

Room에서 기본적으로 저장하지 못하기 때문에 저장할 수 있는 자료형으로 바꿔줘야한다.


RoomConverter

@TypeConverter를 함수에 선언하고 함수에서 자료형을 바꾸는 법을 명시한다.

class RoomTypeConverter {
    @TypeConverter
    fun dateToLong(date: Date): Long {
        return date.time
    }

    @TypeConverter
    fun longToDate(time: Long): Date {
        return Date(time)
    }
}

 

AppDatabase

@TypeConverters를 사용하여 TypeConverter를 나열한다.

@Database(entities = [Drawer::class, ToDo::class], version = 2, exportSchema = true)
@TypeConverters(AppDatabase.RoomTypeConverter::class)
abstract class AppDatabase : RoomDatabase() {
    companion object {
        private var instance: AppDatabase? = null

        fun getInstance(context: Context): AppDatabase {
            return instance ?: synchronized(this) {
                Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME)
                    .addCallback(object : Callback() {
                        override fun onCreate(db: SupportSQLiteDatabase) {
                            super.onCreate(db)
                            CoroutineScope(Dispatchers.IO).launch {
                                getInstance(context).drawer().insert(
                                    Drawer(name = "ToDo")
                                )
                            }
                        }
                    })
                    .addMigrations(MIGRATION_1_2)
//                    .allowMainThreadQueries()
                    .build()
            }.also {
                instance = it
            }
        }

        private val MIGRATION_1_2 = object : Migration(1, 2) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL("ALTER TABLE ToDo ADD COLUMN isFinished INTEGER DEFAULT 0 NOT NULL")
            }
        }
    }

    abstract fun drawer(): DrawerDao
    abstract fun todo(): ToDoDao

    class RoomTypeConverter {
        @TypeConverter
        fun dateToLong(date: Date): Long {
            return date.time
        }

        @TypeConverter
        fun longToDate(time: Long): Date {
            return Date(time)
        }
    }
}

 

ToDoDao

TypeConverter로 바꿀 수 있는 자료형은 DAO에서 그대로 사용할 수 있다.

@Dao
interface ToDoDao : BaseDao<ToDo> {
    @Transaction
    @Query("SELECT * FROM ToDo WHERE drawerName = :drawerName")
    fun findLiveDataByDrawerName(drawerName: String): LiveData<MutableList<ToDo>>

    @Transaction
    @Query("SELECT * FROM ToDo WHERE :begin <= writtenTime AND writtenTime <= :end")
    fun findLiveDateByRange(begin: Date, end: Date): LiveData<MutableList<ToDo>>
}

Git (예제코드)

github.com/KangTaeJong98/Example/tree/main/Android/Room

 

KangTaeJong98/Example

My Example Code. Contribute to KangTaeJong98/Example development by creating an account on GitHub.

github.com


 

Comments