# 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
}
```