前言
最近在學(xué)習(xí) Google 推出的框架Jetpack,雖然目前網(wǎng)上的資料已經(jīng)很多了,但為了加深印象和邊動手練習(xí)跟著學(xué)習(xí),所以站在了下面的巨人的肩膀上,并根據(jù)當(dāng)前最新的API 和編寫實際Demo,記錄下一些學(xué)習(xí)筆記,大部分是參考巨人們的吠昭,整理和休整,加入自己理解和更新吧胧瓜,學(xué)習(xí)領(lǐng)略了Android Jetpack組件的一點魅力
目前學(xué)習(xí)筆記系列為:
- Android Jetpack 之 Lifecycles ---入門使用
- Android Jetpack 之 LiveData---入門使用
- Android Jetpack 之 Room ---入門使用
- Android Jetpack 之 WorkManger---入門使用
- ....待續(xù)
日常鳴謝巨人
正題
Room 簡介
Room是Google提供的一個ORM庫
Room提供了三個主要的組件
- @Database:@Database用來注解類矢棚,并且注解的類必須是繼承自RoomDatabase的抽象類。該類主要作用是創(chuàng)建數(shù)據(jù)庫和創(chuàng)建Daos(data access objects府喳,數(shù)據(jù)訪問對象)
- @Entity:@Entity用來注解實體類蒲肋,@Database通過entities屬性引用被@Entity注解的類,并利用該類的所有字段作為表的列名來創(chuàng)建表
- @Dao:@Dao用來注解一個接口或者抽象方法钝满,該類的作用是提供訪問數(shù)據(jù)庫的方法兜粘。在使用@Database注解的類中必須定一個不帶參數(shù)的方法,這個方法返回使用@Dao注解的類
入門使用
添加依賴
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
def room_version = "1.1.1"
implementation "android.arch.persistence.room:runtime:$room_version"
// use kapt for Kotlin
annotationProcessor "android.arch.persistence.room:compiler:$room_version"
// optional - RxJava support for Room
implementation "android.arch.persistence.room:rxjava2:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "android.arch.persistence.room:guava:$room_version"
kapt 'android.arch.persistence.room:compiler:1.1.1'
創(chuàng)建實體類 用 @Entity 注解
@Entity(tableName = "users")
class User {
@PrimaryKey(autoGenerate = true)
var uid: Int = 0
@ColumnInfo(name = "user_name")
var name: String = ""
@ColumnInfo(name = "user_age")
var age: Int = 0
override fun toString(): String {
return "{User, uid : $uid ,name : $name ,age :$age}"
}
}
- tableName = "users" 表名
- ColumnInfo(name = "user_name") 列名
- PrimaryKey(autoGenerate = true) 主鍵舱沧,自增長
創(chuàng)建訪問數(shù)據(jù)庫的接口類 使用@DAO注解
主要是聲明訪問數(shù)據(jù)庫的方法
@Insert
fun insertAll(vararg users: User)
@Delete
fun delete(user: User)
@Delete
fun deleteAll(users: List<User>)
@Query("SELECT * FROM users")
fun getAllUsers():List<User>
@Update
fun updateUser(user: User)
針對 SQLite的 CURD 四大操作妹沙,分別對應(yīng)四種注解
- @Insert
- @Delete
- @Query("SELECT * FROM users")
- @Update
創(chuàng)建 AppDataBase ,使用 @Database 注解
@Database(entities = arrayOf(User::class), version = 2)
abstract class AppDataBase : RoomDatabase() {
// 必須包含一個具有0個參數(shù)且返回帶@Dao注釋的類的抽象方法
abstract fun userDao(): UserDao
companion object {
private var appDataBase: AppDataBase? = null
fun getInstance(context: Context): AppDataBase? {
if (appDataBase == null) {
synchronized(AppDataBase::class.java) {
appDataBase = Room.databaseBuilder(context.applicationContext, AppDataBase::class.java, "user_database").build()
}
}
return appDataBase!!
}
}
}
- version = 2 數(shù)據(jù)庫版本熟吏,更新數(shù)據(jù)庫模型時,需要更新
- entities = 玄窝,對應(yīng)使用 @Entity 標(biāo)記的實體類
- abstract fun userDao(): UserDao 必須包含一個具有0個參數(shù)且返回帶@Dao注釋的類的抽象方法牵寺,也就是返回 @Dao 標(biāo)記的訪問數(shù)據(jù)庫的接口類
- 使用單例,提供外部獲得AppDataBase 實例的創(chuàng)建
創(chuàng)建數(shù)據(jù)庫恩脂,并執(zhí)行 CURD操作
// init dao
userDao = AppDataBase.getInstance(this)!!.userDao()
// 增加用戶
val user = User()
user.name = "用戶A"
user.age = 20
rDao!!.insertAl(user)
//查找全部用戶
val users =userDao!!.getAllUsrs()
//刪除指定id 用戶
val user = User()
user.uid = 1
userDao!!.delee(user)
//更新某指定id 用戶
val user = User()
user.uid = 1
user.name = "用戶A被改名了"
userDao!!.updateUser(user)