主要由Entity、DAO、RoomDatabase組成
Entity
@Entity(tableName = "users")
class User(
@PrimaryKey(autoGenerate = true) val id:Int,
@ColumnInfo(name = "name") val name:String,
@ColumnInfo(name = "mobile") val mobile:String,
@ColumnInfo(name="address") val address:String
)
DAO
@Dao
interface UserDao {
@Query("SELECT * from users ORDER BY id ASC")
fun getALL(): LiveData<List<User>>
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insert(user:User)
@Query("DELETE FROM users")
fun deleteAll()
}
RoomDatabase
@Database(entities = arrayOf(User::class), version = 3, exportSchema = false)
abstract class UserRoomDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
companion object {
@Volatile
private var INSTANCE: UserRoomDatabase? = null
fun getDataBase(context: Context): UserRoomDatabase {
val tempInstance = INSTANCE
if (tempInstance != null) {
return tempInstance
}
synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext, UserRoomDatabase::class.java,
"users"
)
.addMigrations(MIGRATION_1_2)
.addMigrations(MIGRATION_2_3)
.build()
INSTANCE = instance
return instance
}
}
//如果有新增欄位一定要好好寫描述,然後還要加上not null & default value
val MIGRATION_1_2: Migration = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE users ADD COLUMN mobile TEXT NOT NULL DEFAULT ''")
}
}
val MIGRATION_2_3: Migration = object : Migration(2, 3) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE users ADD COLUMN address TEXT NOT NULL DEFAULT ''")
}
}
}
}
不能在主執行緒跑
AsyncTask.execute {
val dao = UserRoomDatabase.getDataBase(this).userDao()
dao.insert(User(id = 0, name = "123",mobile = "99999",address = "66666"))
}