Android—Room數(shù)據(jù)庫(kù)(介紹)

Android-Room數(shù)據(jù)庫(kù)-多表查詢(Relationships)

Android-Room自定義類型(TypeConverter)

Android—Room?數(shù)據(jù)庫(kù)遷移(Migration)

Android — Room?數(shù)據(jù)庫(kù)跳躍式升級(jí)(Migration)

Android—Room 通用封裝

前言

Google終于發(fā)布了一個(gè)和SQLite相關(guān)的庫(kù)了??????因悲。之前一直都是在SQLite、XUtils澜公、greenDao胞此、Realm這些數(shù)據(jù)庫(kù)之間來(lái)回折騰。現(xiàn)在終于有一個(gè)更“正統(tǒng)”數(shù)據(jù)庫(kù)了宁否。

Room是什么缀遍?

Room是一個(gè)持久性數(shù)據(jù)庫(kù)瑟由。

Room持久性庫(kù)提供了SQLite的抽象層歹苦,以便在充分利用SQLite的同時(shí)允許流暢的數(shù)據(jù)庫(kù)訪問(wèn)殴瘦。

為什么會(huì)選擇Room蚪腋?

前面我也說(shuō)到了現(xiàn)在也有不少開源的數(shù)據(jù)庫(kù)給大家使用屉凯,那為什么我們還要去學(xué)習(xí)使用這個(gè)庫(kù)呢?當(dāng)然不是我前面說(shuō)的“正不正統(tǒng)”的原因了悠砚。
因?yàn)镽oom有下面幾個(gè)優(yōu)點(diǎn):
① SQL查詢?cè)诰幾g時(shí)就會(huì)驗(yàn)證 - 在編譯時(shí)檢查每個(gè)@Query和@Entity等灌旧,這就意味著沒(méi)有任何運(yùn)行時(shí)錯(cuò)誤的風(fēng)險(xiǎn)可能會(huì)導(dǎo)致應(yīng)用程序崩潰(并且它不僅檢查語(yǔ)法問(wèn)題,還會(huì)檢查是否有該表)
② 較少的模板代碼
③ 與 LiveData集成

該如何使用它描融?

1衡蚂、在app/build.gradle中添加以下依賴

implementation 'android.arch.persistence.room:runtime:1.0.0'
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'

你可以點(diǎn)擊這里查看最新依賴版本號(hào)

2骏庸、創(chuàng)建JavaBean

@Entity
public class User {
    
    @PrimaryKey(autoGenerate = true)//主鍵是否自動(dòng)增長(zhǎng),默認(rèn)為false
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
   //這里的getter/setter方法是必須的
   //這里的getter/setter方法是必須的
   //這里的getter/setter方法是必須的
   //重要的事說(shuō)三遍
}
  • 這里需要使用@Entity來(lái)注解該類
  • 至少要有一個(gè)主鍵@PrimaryKey

3、創(chuàng)建Dao
接下來(lái)改执,需要為我們的實(shí)體創(chuàng)建DAO辈挂。 DAO代表數(shù)據(jù)訪問(wèn)對(duì)象终蒂,所以它是告訴我們的數(shù)據(jù)庫(kù)如何操作數(shù)據(jù)的一種方式:

@Dao
public interface UserDao {
    @Query("SELECT * FROM user")
    List<User> getAllUsers();

    @Insert
    void insert(User... users);

    @Update
    void update(User... users);

    @Delete
    void delete(User... users);
}
  • 使用@Dao注解該接口
  • @Insert, @Update, @Delete,@Query代表我們常用的插入拇泣、更新霉翔、刪除苞笨、查詢數(shù)據(jù)庫(kù)操作

@Insert, @Update, @Delete可以傳入多種不同的參數(shù)瀑凝。例如:

@Insert
void insert(User... users);

@Insert
void insert(User user);

@Insert
void insert(List<User> userLists);

同理,@Query也可以返回多種不同的類型芝加。

@Query("SELECT * FROM user")
List<User> getAllUsers();

@Query("SELECT * FROM user WHERE id=:id")
User getUser(int id);

@Query("SELECT * FROM user")
Cursor getUserCursor();

當(dāng)然射窒,除了這些我們還可以傳入一些限制符進(jìn)去。例如脉顿,

@Query("SELECT * FROM user WHERE age=:age")
List<User> getUsersByAge(int age);

@Query("SELECT * FROM user WHERE age=:age LIMIT :max")
List<User> getUsersByAge(int max, int... age);

4蝌麸、創(chuàng)建數(shù)據(jù)庫(kù)

@Database(entities = { User.class }, version = 1,exportSchema = false)
public abstract class UserDatabase extends RoomDatabase {

    private static final String DB_NAME = "UserDatabase.db";
    private static volatile UserDatabase instance;

    static synchronized UserDatabase getInstance(Context context) {
        if (instance == null) {
            instance = create(context);
        }
        return instance;
    }

    private static UserDatabase create(final Context context) {
        return Room.databaseBuilder(
            context,
            UserDatabase.class,
            DB_NAME).build();
    }

    public abstract UserDao getUserDao();
}

這里使用@Database注解該類并添加了表名艾疟、數(shù)據(jù)庫(kù)版本(每當(dāng)我們改變數(shù)據(jù)庫(kù)中的內(nèi)容時(shí)它都會(huì)增加)敢辩,所以這里使用exportSchema = false

注意:除了添加表映射的類以及和數(shù)據(jù)庫(kù)版本外,還要添加exportSchema = false否則會(huì)報(bào)警告弟疆。
Error:(10, 17) 警告: Schema export directory is not provided to the annotation processor so we cannot export the schema. You can either provide room.schemaLocation annotation processor argument OR set exportSchema to false.

我們抽象了getUserDao()方法戚长,這是必要的怠苔。

5同廉、使用數(shù)據(jù)庫(kù)
我們終于能夠操作我們的數(shù)據(jù)庫(kù)了迫肖。但是所有的操作必須在后臺(tái)線程中完成蟆湖。你可以通過(guò)使用AsyncTask玻粪,ThreadHandlerRxJava或其它方式來(lái)完成痹籍。
如果沒(méi)有在后臺(tái)線程執(zhí)行呢铆,并且也沒(méi)有說(shuō)明可以在主線程操作的話,就會(huì)報(bào)以下錯(cuò)誤蹲缠。

Caused by: java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

例如棺克,我們可以像下面這樣插入數(shù)據(jù)

User user=new User();
user.setName("name1");
user.setAge(18);
UserDatabase
        .getInstance(context)
        .getUserDao()
        .insert(user);

或者這樣

List<User> allUsers = UserDatabase
        .getInstance(RoomActivity.this)
        .getUserDao()
        .getAllUsers();

好了,基本的使用的方式就這些了线定。未完待續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末娜谊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子斤讥,更是在濱河造成了極大的恐慌纱皆,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芭商,死亡現(xiàn)場(chǎng)離奇詭異派草,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)铛楣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門近迁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人簸州,你說(shuō)我怎么就攤上這事鉴竭∑缙” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵搏存,是天一觀的道長(zhǎng)瑰步。 經(jīng)常有香客問(wèn)我,道長(zhǎng)璧眠,這世上最難降的妖魔是什么缩焦? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蛆橡,結(jié)果婚禮上舌界,老公的妹妹穿的比我還像新娘掘譬。我一直安慰自己泰演,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布葱轩。 她就那樣靜靜地躺著睦焕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪靴拱。 梳的紋絲不亂的頭發(fā)上垃喊,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音袜炕,去河邊找鬼本谜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛偎窘,可吹牛的內(nèi)容都是我干的乌助。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼陌知,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼他托!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起仆葡,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赏参,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后沿盅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體把篓,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年腰涧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纸俭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡南窗,死狀恐怖揍很,靈堂內(nèi)的尸體忽然破棺而出郎楼,到底是詐尸還是另有隱情,我是刑警寧澤窒悔,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布呜袁,位于F島的核電站,受9級(jí)特大地震影響简珠,放射性物質(zhì)發(fā)生泄漏阶界。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一聋庵、第九天 我趴在偏房一處隱蔽的房頂上張望膘融。 院中可真熱鬧,春花似錦祭玉、人聲如沸氧映。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)岛都。三九已至,卻和暖如春振峻,著一層夾襖步出監(jiān)牢的瞬間臼疫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工扣孟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烫堤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓凤价,卻偏偏與公主長(zhǎng)得像鸽斟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子料仗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容