# Kotlin 新舊 Room 初始化 ###### tags: `Kotlin` `Android` `Room` ### 2018 年寫法: ``` @Database( entities = [LogDetail::class, WiFiEntity::class, BlueToothLeEntity::class], version = 2 ) @TypeConverters(DateConverter::class) abstract class AppDataBase : RoomDatabase() { abstract fun logDetailDao(): LogDetailDao abstract fun wiFiEntityDao(): WiFiEntityDao abstract fun bleEntityDao(): BleEntityDao companion object { @Volatile private var INSTANCE: AppDataBase? = null fun getInstance(context: Context): AppDataBase = INSTANCE ?: synchronized(this) { INSTANCE ?: buildDatabase(context).also { INSTANCE = it } } private fun buildDatabase(context: Context) = Room.databaseBuilder( context.applicationContext, AppDataBase::class.java, "AppMemoVer1.db") // java.lang.IllegalStateException: A migration from 1 to 2 was required but not found. // Please provide the necessary Migration path viaRoomDatabase.Builder.addMigration(Migration ...) or // allow for destructive migrations via one of the RoomDatabase.Builder.fallbackToDestructiveMigration* methods. .fallbackToDestructiveMigration() .build() } } ``` ### 2019 CodeLab 學習 Kotlin coroutine 寫法 ``` /** * Title represents the title fetched from the network */ @Entity data class Title constructor(val title: String, @PrimaryKey val id: Int = 0) /*** * Very small database that will hold one title */ @Dao interface TitleDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertTitle(title: Title) @Query("select * from Title where id = 0") fun loadTitle(): LiveData<Title> } /** * TitleDatabase provides a reference to the dao to repositories */ @Database( entities = [Title::class], version = 1, exportSchema = false ) abstract class TitleDatabase : RoomDatabase() { abstract val titleDao: TitleDao } private lateinit var INSTANCE: TitleDatabase /** * Instantiate a database from a context. */ fun getDatabase(context: Context): TitleDatabase { synchronized(TitleDatabase::class) { if (!::INSTANCE.isInitialized) { INSTANCE = Room .databaseBuilder( context.applicationContext, TitleDatabase::class.java, "titles_db" ) .fallbackToDestructiveMigration() .build() } } return INSTANCE } ```