Android使用Room數(shù)據(jù)庫(kù)解決本地持久化的操作
Room概述
Room 是一個(gè)持久性庫(kù),屬于 Android Jetpack 的一部分。
Room 是 SQLite 數(shù)據(jù)庫(kù)之上的一個(gè)抽象層。Room 并不直接使用 SQLite,而是負(fù)責(zé)簡(jiǎn)化數(shù)據(jù)庫(kù)設(shè)置和配置以及與數(shù)據(jù)庫(kù)交互方面的瑣碎工作。此外,Room 還提供 SQLite 語句的編譯時(shí)檢查。
Room主要組件
Room 包含三個(gè)主要組件:
- 數(shù)據(jù)實(shí)體表示應(yīng)用的數(shù)據(jù)庫(kù)中的表。數(shù)據(jù)實(shí)體用于更新表中的行所存儲(chǔ)的數(shù)據(jù)以及創(chuàng)建新行供插入。
- 數(shù)據(jù)訪問對(duì)象 (DAO) 提供應(yīng)用在數(shù)據(jù)庫(kù)中檢索、更新、插入和刪除數(shù)據(jù)所用的方法。
- 數(shù)據(jù)庫(kù)類持有數(shù)據(jù)庫(kù),并且是應(yīng)用數(shù)據(jù)庫(kù)底層連接的主要訪問點(diǎn)。數(shù)據(jù)庫(kù)類為應(yīng)用提供與該數(shù)據(jù)庫(kù)關(guān)聯(lián)的 DAO 的實(shí)例。
Room各組件之間協(xié)同工作圖例
添加Room庫(kù)
在build.gradle文件中添加依賴:
dependencies { //Room def room_version = "2.5.0" implementation "androidx.room:room-runtime:$room_version" annotationProcessor "androidx.room:room-compiler:$room_version" }
版本號(hào)請(qǐng)查閱官方文檔:
https://developer.android.google.cn/jetpack/androidx/releases/room?hl=zh_cn#groovy
創(chuàng)建Item 實(shí)體—Entity
實(shí)體類定義了一個(gè)表,每個(gè)實(shí)例都是表的某一行。用映射的方式,實(shí)體類告知Room數(shù)據(jù)庫(kù),它應(yīng)如何呈現(xiàn)數(shù)據(jù)庫(kù)中的信息并與之交互。
@Entity 注解用于將某個(gè)類標(biāo)記為數(shù)據(jù)庫(kù)實(shí)體類。對(duì)于每個(gè)實(shí)體類,系統(tǒng)都會(huì)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)表來保存相關(guān)項(xiàng)。存儲(chǔ)在數(shù)據(jù)庫(kù)中的每個(gè)實(shí)體實(shí)例必須有一個(gè)主鍵,用于唯一標(biāo)識(shí)數(shù)據(jù)庫(kù)表中的每個(gè)記錄/條目。主鍵一旦賦值就不能修改,只要它還存在于數(shù)據(jù)庫(kù)中,它就表示相應(yīng)的實(shí)體對(duì)象。
在類之前加上 @Entity 注解來標(biāo)識(shí)數(shù)據(jù)庫(kù)的實(shí)體,編譯時(shí),系統(tǒng)便會(huì)根據(jù)這個(gè)類的設(shè)定來創(chuàng)建數(shù)據(jù)庫(kù)。
@Entity() public class Word{ }
如果Entity()
的參數(shù)為空,系統(tǒng)在創(chuàng)建數(shù)據(jù)庫(kù)時(shí),會(huì)把類名作為數(shù)據(jù)庫(kù)的表名,如果要自定義表名,可以直接在Entity()里輸入?yún)?shù):
@Entity(tableName = "yourTableName")
接下來,我們應(yīng)該添加:
- 數(shù)據(jù)庫(kù)的元素
- 主鍵:每一個(gè)實(shí)體至少定義一個(gè)字段作為主鍵。可以將@PrimaryKey的autoGenerate屬性設(shè)置為true來設(shè)置自動(dòng)id。如果實(shí)體有一個(gè)復(fù)合的主鍵,可以使用 @Entity的primaryKeys屬性來指定主鍵。
元素包括:
- id
- word
- chineseMearning
@PrimaryKey(autoGenerate = true) private int id; @ColumnInfo(name = "english_word") private String word; @ColumnInfo(name = "chinese_mearning") private String chineseMeaning;
再加上幾個(gè)get/set方法就定義完成了!
創(chuàng)建item 數(shù)據(jù)訪問對(duì)象—Dao
新建一個(gè)MyDao對(duì)象的接口作為數(shù)據(jù)庫(kù)操作的接口,在這個(gè)接口中,我們定義數(shù)據(jù)庫(kù)的增刪改查操作,在此之前,我們需要用 @Dao 來標(biāo)記這個(gè)類為Dao類:
例如:
@Dao //Database access object public interface WordDao { @Insertvoid insertWords(Word... words); @Updateint updateWords(Word... words); @Deletevoid deleteWords(Word...words); }
如果我們要使用SQL語句,我們可以這么寫:
@Dao //Database access object public interface WordDao { @Insertvoid insertWords(Word... words); @Updateint updateWords(Word... words); @Deletevoid deleteWords(Word...words); @Query("DELETE FROM WORD") void deleteWords(); @Query("SELECT * FROM WORD ORDER BY ID DESC") List<Word> getAllWords(); }
創(chuàng)建數(shù)據(jù)庫(kù)實(shí)例—Database
我們將創(chuàng)建database類,通過繼承改寫room的database,把word.class
和wordDao.class
聯(lián)系在一起,組成一個(gè)完整的數(shù)據(jù)庫(kù)。
在同一個(gè)位置新建一個(gè)WordDatabase的數(shù)據(jù)庫(kù),父類是androidx.room.RoomDatabase,為abstract類型。
我們通過@Database()
來標(biāo)記這個(gè)類為database類,在它的參數(shù)中我們可以定義:
- entities:傳入所有Entity的class對(duì)象;
- version:數(shù)據(jù)庫(kù)版本號(hào)。
- exportSchema:設(shè)置是否導(dǎo)出數(shù)據(jù)庫(kù)schema,默認(rèn)為true,需要在build.gradle中設(shè)置:
當(dāng)數(shù)據(jù)庫(kù)發(fā)生改變時(shí),數(shù)據(jù)庫(kù)版本號(hào)會(huì)接著改變,以便更好的進(jìn)行備份恢復(fù),這里我們用不到,就隨便設(shè)計(jì)一個(gè)值。
上面的Database()中,我們已經(jīng)把Entity連接到了database中,在Dao類中,我們需要把wordDao類連接到數(shù)據(jù)庫(kù)中,我們就需要實(shí)例化一個(gè)WordDao類:
@Database(entities = {Word.class},version = 1, exportSchema = false) public abstract class WordDatabase extends RoomDatabase { public abstract WordDao getWordDao(); }
使用Room數(shù)據(jù)庫(kù)
獲取AppDatabase實(shí)例:
AppDatabase wordDatabase = Room.databaseBuilder(getApplicationContext(),AppDatabase.class, "user.db").build();
使用Room可以參考:
wordDao = wordDatabase.getWordDao(); // new a dao List<Word> list = wordDao.getAllWords(); //get all data from database with sql: select * from word
結(jié)語
以上就是Android使用Room數(shù)據(jù)庫(kù)解決本地持久化的操作的詳細(xì)內(nèi)容,更多關(guān)于Android Room本地持久化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
雙緩沖技術(shù)實(shí)現(xiàn)Android 畫板應(yīng)用
這篇文章主要介紹了Android 采用雙緩存技術(shù)實(shí)現(xiàn)畫板應(yīng)用的相關(guān)資料,并附有代碼實(shí)例,有需要的小伙伴可以參考下2016-07-07Flutter上線項(xiàng)目實(shí)戰(zhàn)記錄之路由篇
這篇文章主要給大家介紹了關(guān)于Flutter上線項(xiàng)目實(shí)戰(zhàn)記錄之路由篇的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Flutter具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Android RenderScript實(shí)現(xiàn)高斯模糊
這篇文章主要為大家詳細(xì)介紹了Android RenderScript實(shí)現(xiàn)高斯模糊的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Android xmlns 的作用及其自定義實(shí)例詳解
這篇文章主要介紹了 Android xmlns 的作用及其自定義實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06Android實(shí)現(xiàn)登錄注冊(cè)功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)登錄注冊(cè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04RxJava 1升級(jí)到RxJava 2過程中踩過的一些“坑”
RxJava2相比RxJava1,它的改動(dòng)還是很大的,那么下面這篇文章主要給大家總結(jié)了在RxJava 1升級(jí)到RxJava 2過程中踩過的一些“坑”,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下來要一起看看吧。2017-05-05android BitmapFactory.Options使用方法詳解
這篇文章主要為大家詳細(xì)介紹了android BitmapFactory.Options使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01