Entity
Entity的實(shí)例對(duì)應(yīng)的是對(duì)象模型數(shù)據(jù)庫中數(shù)據(jù)表的一行數(shù)據(jù),其數(shù)據(jù)結(jié)構(gòu)自然就是對(duì)應(yīng)著表結(jié)構(gòu). 而這種映射結(jié)構(gòu)是用注釋來標(biāo)明的.
- 表名 --> 類名
@Entity(tableName = "user") - 列名 --> 成員變量名
@ColumnInfo(name = "first_name") - 存儲(chǔ)數(shù)據(jù)類型 --> 成員變量數(shù)據(jù)類型
var name: String = "" - 主鍵
@PrimaryKey(autoGenerate = true) - 索引
@Entity(indices = {@Index(value = {"first_name", "last_name"}, unique = true)}) - 外鍵
@Entity(indices = arrayOf(Index(value = *arrayOf("first_name", "last_name"), unique = true)))
class User {
@PrimaryKey
var id: Int = 0
@ColumnInfo(name = "first_name")
var firstName: String? = null
@ColumnInfo(name = "last_name")
var lastName: String? = null
@Ignore
var picture: Bitmap? = null
}
@Entity(foreignKeys = arrayOf(ForeignKey(entity = User::class, parentColumns = arrayOf("id"), childColumns = arrayOf("user_id"))))
class Book {
@PrimaryKey
var bookId: Int = 0
var title: String? = null
@ColumnInfo(name = "user_id")
var userId: Int = 0
}
Dao (Data Access Objects)
Dao 是數(shù)據(jù)管理層,負(fù)責(zé)對(duì)數(shù)據(jù)庫進(jìn)行增刪改查的操作
你只需要簡單地用注解標(biāo)注,就能自動(dòng)生成相關(guān)的代碼了.值得注意的是,這些代碼都需要在子線程中運(yùn)行,所以用其配合Rxjava是再好不過的了
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll():Flowable<List<User>>
@Insert(onConflict = REPLACE)
fun insert(user: User)
@Update(onConflict = REPLACE)
fun update(user: User)
@Delete
fun delete(user: User)
}
Database
最后,我們來到了Database,它標(biāo)注了數(shù)據(jù)庫的名稱,版本,包含的表.最重要的是,生成Dao的獲取方法.
@android.arch.persistence.room.Database(entities = arrayOf(User::class), version = 1)
abstract class Database : RoomDatabase() {
abstract fun userDao(): UserDao
}
當(dāng)然,我們還需要一個(gè)單例來讓我們獲取這個(gè)數(shù)據(jù)庫的實(shí)例,如下
class DataBaseHelper private constructor() {
companion object {
val instance by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
DataBaseHelper()
}
}
var database: Database? = null
fun setup(context: Context) {
database = Room.databaseBuilder(context.applicationContext, Database::class.java, "database.sqlite")
.build()
}
}