Entity
Entity的實例對應的是對象模型數據庫中數據表的一行數據,其數據結構自然就是對應著表結構. 而這種映射結構是用注釋來標明的.
- 表名 --> 類名
@Entity(tableName = "user")
- 列名 --> 成員變量名
@ColumnInfo(name = "first_name")
- 存儲數據類型 --> 成員變量數據類型
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 是數據管理層,負責對數據庫進行增刪改查的操作
你只需要簡單地用注解標注,就能自動生成相關的代碼了.值得注意的是,這些代碼都需要在子線程中運行,所以用其配合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,它標注了數據庫的名稱,版本,包含的表.最重要的是,生成Dao的獲取方法.
@android.arch.persistence.room.Database(entities = arrayOf(User::class), version = 1)
abstract class Database : RoomDatabase() {
abstract fun userDao(): UserDao
}
當然,我們還需要一個單例來讓我們獲取這個數據庫的實例,如下
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()
}
}