Android Jetpack 之 Room ---入門使用

前言

最近在學(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í)筆記系列為:

日常鳴謝巨人

Google官方博文

CSDN 博主Alex@W

正題

Room 簡介

Room是Google提供的一個ORM庫

Room提供了三個主要的組件

  1. @Database:@Database用來注解類矢棚,并且注解的類必須是繼承自RoomDatabase的抽象類。該類主要作用是創(chuàng)建數(shù)據(jù)庫和創(chuàng)建Daos(data access objects府喳,數(shù)據(jù)訪問對象)
  2. @Entity:@Entity用來注解實體類蒲肋,@Database通過entities屬性引用被@Entity注解的類,并利用該類的所有字段作為表的列名來創(chuàng)建表
  3. @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}"
        }
    }
  1. tableName = "users" 表名
  2. ColumnInfo(name = "user_name") 列名
  3. 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)四種注解

  1. @Insert
  2. @Delete
  3. @Query("SELECT * FROM users")
  4. @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!!
            }
        }
    }
  1. version = 2 數(shù)據(jù)庫版本熟吏,更新數(shù)據(jù)庫模型時,需要更新
  2. entities = 玄窝,對應(yīng)使用 @Entity 標(biāo)記的實體類
  3. abstract fun userDao(): UserDao 必須包含一個具有0個參數(shù)且返回帶@Dao注釋的類的抽象方法牵寺,也就是返回 @Dao 標(biāo)記的訪問數(shù)據(jù)庫的接口類
  4. 使用單例,提供外部獲得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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帽氓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子俩块,更是在濱河造成了極大的恐慌黎休,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玉凯,死亡現(xiàn)場離奇詭異势腮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)漫仆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門捎拯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盲厌,你說我怎么就攤上這事署照』隼幔” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵建芙,是天一觀的道長没隘。 經(jīng)常有香客問我,道長禁荸,這世上最難降的妖魔是什么升略? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮屡限,結(jié)果婚禮上品嚣,老公的妹妹穿的比我還像新娘。我一直安慰自己钧大,他們只是感情好翰撑,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啊央,像睡著了一般眶诈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓜饥,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天逝撬,我揣著相機(jī)與錄音,去河邊找鬼乓土。 笑死宪潮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的趣苏。 我是一名探鬼主播狡相,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼食磕!你這毒婦竟也來了尽棕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤彬伦,失蹤者是張志新(化名)和其女友劉穎滔悉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體单绑,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡回官,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了询张。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孙乖。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出唯袄,到底是詐尸還是另有隱情弯屈,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布恋拷,位于F島的核電站资厉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蔬顾。R本人自食惡果不足惜宴偿,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诀豁。 院中可真熱鬧窄刘,春花似錦、人聲如沸舷胜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烹骨。三九已至翻伺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沮焕,已是汗流浹背吨岭。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留峦树,地道東北人辣辫。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像空入,于是被迫代替她去往敵國和親络它。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353