JetPack學(xué)習(xí)之路一:Room庫的使用(Kotlin)

Android Jetpack

Jetpack 是一套庫、工具和指南莫绣,可幫助開發(fā)者更輕松地編寫優(yōu)質(zhì)應(yīng)用匪补。這些組件可幫助您遵循最佳做法、讓您擺脫編寫樣板代碼的工作并簡化復(fù)雜任務(wù)溢豆,以便您將精力集中放在所需的代碼上。
Jetpack 包含與平臺 API 解除捆綁的 androidx.* 軟件包庫瘸羡。這意味著漩仙,它可以提供向后兼容性,且比 Android 平臺的更新頻率更高犹赖,以此確保您始終可以獲取最新且最好的 Jetpack 組件版本队他。

Room

Room 持久性庫在 SQLite 的基礎(chǔ)上提供了一個抽象層,讓用戶能夠在充分利用 SQLite 的強(qiáng)大功能的同時峻村,獲享更強(qiáng)健的數(shù)據(jù)庫訪問機(jī)制麸折。

開始使用

1.注入依賴

在app目錄下的build.gradle的dependencies添加如下代碼

 def room_version = "2.2.5"
 implementation "androidx.room:room-runtime:$room_version"
 kapt  "androidx.room:room-compiler:$room_version"

此處需要說明的是使用kapt 需要在該文件的最上方添加

apply plugin: 'kotlin-kapt'

2.創(chuàng)建ORM映射類

    @Entity
    class Person constructor(){
        constructor(name:String,age:Int):this(){
            this.name = name
            this.age = age
        }
        @PrimaryKey(autoGenerate = true)
        var id:Int? = null
        var name:String? = null
        var age:Int? = null
    
        @Ignore
        var sex:Int?=null
        override fun toString(): String {
            return "Person(id=$id, name=$name, age=$age, sex=$sex)"
        }
    }

可以看見類中用到了幾個注解,那就先來了解一下相關(guān)的注解及作用粘昨。

@Entity注解:標(biāo)識數(shù)據(jù)庫映射關(guān)系的類垢啼,可以指定表名等,不指定的話默認(rèn)表=名和類名一致张肾,索引等信息
@PrimaryKey注解:指定主鍵芭析,可設(shè)置自動增長等屬性
@ColumnInfo注解:指定列信息,如列名等信息
@Ignore注解:標(biāo)識忽略此屬性吞瞪,不對應(yīng)生成數(shù)據(jù)庫字段
@Dao注解:標(biāo)識Dao層注解馁启,編譯時候會生成該接口或抽象類的實現(xiàn)
@Insert注解:標(biāo)識該抽象方法為插入數(shù)據(jù)庫,入?yún)镋ntity注解標(biāo)注的類對象
@Query注解:標(biāo)識該抽象方法為查詢的方法(表面)芍秆,需傳入sql語句惯疙,其實sql語句可以實現(xiàn)增刪改查的操作,也就是說可以實現(xiàn)常用全部操作
@Delete注解:標(biāo)注該方法為刪除的方法妖啥,入?yún)镋ntity注解標(biāo)注的類對象
@Update注解:標(biāo)注該方法為更新的方法霉颠,入?yún)镋ntity注解標(biāo)注的類對象
@Database注解:標(biāo)注該類為數(shù)據(jù)庫操作類,一般為單例對象迹栓,入?yún)ntities為對應(yīng)映射的kclass對象集合掉分,verson處理數(shù)據(jù)庫升級相關(guān)俭缓,通過此類可以拿到相關(guān)數(shù)據(jù)庫操作的dao對象克伊,進(jìn)行相關(guān)的數(shù)據(jù)庫操作

3.創(chuàng)建Dao(常用增刪改查四個方法)

    @Dao
    abstract class PersonDao {
        @Insert
        abstract fun insert(person: Person)
        @Delete
        abstract fun delete(person: Person)
        @Update
        abstract fun update(person: Person)
        @Query("SELECT * FROM Person")
        abstract fun getPersonList():MutableList<Person>
    }

直接通過對象來操作增刪改查

4.創(chuàng)建RoomDatabase子類,持有dao的引用

    @Database(entities = [Person::class], version = 1)
    abstract class PersonRoomDatabase : RoomDatabase() {
        abstract fun personDao(): PersonDao
        companion object {
            @Volatile
            private var instance: PersonRoomDatabase? = null
            fun getPersonRoomDatabase(context:Context):PersonRoomDatabase{
                if (null == instance){
                    synchronized(PersonRoomDatabase::class){
                        if (null == instance){
                            instance = Room.databaseBuilder(context.applicationContext,PersonRoomDatabase::class.java,"db_person").allowMainThreadQueries().build()
                        }
                    }
                }
                return instance!!
            }
        }
    }

5.調(diào)用(增刪改查)

val personDao = PersonRoomDatabase.getPersonRoomDatabase(this).personDao()
val person = Person("張三",18)
personDao.insert(person)

val person = Person()
person.id = 1
personDao.delete(person)

val person = Person("李四",20)
person.id = 2
personDao.update(person)

var personList: MutableList<Person> = personDao.getPersonList()
Log.d(Common.TAG,"共有${personList.size}個人")
personList.forEach {
    Log.d(Cst.TAG,it.toString())
}

以上就是常用增刪改查的基本操作华坦,想要高端操作愿吹,我們繼續(xù)看

6.拓展操作

用@Query注解也可以實現(xiàn)增刪改,讓你繼續(xù)感受自己寫sql的快感


@Query("insert into Person values (:id,:name,:age)")
    fun insertQuery(id:Int?,name:String?,age:Int?)
@Query("delete from Person where id = :id")
    fun deleteQuery(id:Int?)
@Query("update Person set name = :name , age = :age where id= :id")
    fun updateQuery(id:Int?,name:String?,age:Int?)
@Query("select * from Person where id= :id")
    fun findById(id:Int?): MutableList<Person>
 @Query("select * from Person where age > :age")
    fun findByAge(age:Int?): MutableList<PersonBean>
@Query("select * from Person where name like :name")
    fun findByNameRule(name: String?): MutableList<Person>

調(diào)用方法和上面一樣

7.Room升級

當(dāng)我們增刪表惜姐,修改表結(jié)構(gòu)犁跪,增刪字段的時候就需要升級
升級步驟如下
1.修改版本號椿息,在RoomDatabase的子類中,改變version的值(我上一個版本是1)

@Database(entities = [PersonBean::class,Teacher::class], version = 2)

2.如果是增加表坷衍,則相應(yīng)的增加寝优、減少entities數(shù)組的內(nèi)容,如果是增刪字段枫耳,在對應(yīng)的ORM映射類中增刪即可
3.增加Migration

Room.databaseBuilder(context.applicationContext,PersonRoomDatabase::class.java,"db_test")
                            .addMigrations(object: Migration(1,2){
                                override fun migrate(database: SupportSQLiteDatabase) {
                                    //此處為增刪表乏矾、增刪字段的sql書寫處
                                    database.execSQL("CREATE TABLE IF NOT EXISTS `Teacher` (" +
                                            "`id` INTEGER PRIMARY KEY AUTOINCREMENT," +
                                            "`name` TEXT," +
                                            "`classes` TEXT," +
                                            "`age` INTEGER " +
                                            ");")
                                }
                            })
                            .allowMainThreadQueries().build()

源碼地址

https://github.com/DalesDawson/JetPackStudy

這是本人在學(xué)習(xí)過程中產(chǎn)生的總結(jié),記錄一下迁杨,如有錯誤請各位大佬及時指出

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钻心,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子铅协,更是在濱河造成了極大的恐慌捷沸,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狐史,死亡現(xiàn)場離奇詭異痒给,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)骏全,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門侈玄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吟温,你說我怎么就攤上這事序仙。” “怎么了鲁豪?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵潘悼,是天一觀的道長。 經(jīng)常有香客問我爬橡,道長治唤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任糙申,我火速辦了婚禮宾添,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柜裸。我一直安慰自己缕陕,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布疙挺。 她就那樣靜靜地躺著扛邑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铐然。 梳的紋絲不亂的頭發(fā)上蔬崩,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天恶座,我揣著相機(jī)與錄音,去河邊找鬼沥阳。 笑死跨琳,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桐罕。 我是一名探鬼主播湾宙,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼冈绊!你這毒婦竟也來了侠鳄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤死宣,失蹤者是張志新(化名)和其女友劉穎伟恶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毅该,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡博秫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了眶掌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挡育。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖朴爬,靈堂內(nèi)的尸體忽然破棺而出即寒,到底是詐尸還是另有隱情,我是刑警寧澤召噩,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布母赵,位于F島的核電站,受9級特大地震影響具滴,放射性物質(zhì)發(fā)生泄漏凹嘲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一构韵、第九天 我趴在偏房一處隱蔽的房頂上張望周蹭。 院中可真熱鬧,春花似錦疲恢、人聲如沸凶朗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俱尼。三九已至,卻和暖如春萎攒,著一層夾襖步出監(jiān)牢的瞬間遇八,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工耍休, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留刃永,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓羊精,卻偏偏與公主長得像斯够,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子喧锦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354