初探 Android Room 的使用

  1. build.gradle 中引入依賴
dependencies {
    ...
    implementation "android.arch.persistence.room:runtime:1.0.0"
    annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
    ...
}
  1. 創(chuàng)建實(shí)體類
@Entity(tableName = "user")
public class User {

    @PrimaryKey
    private int uid;

    @ColumnInfo(name = "first_name")
    private String firstName;
    
    @ColumnInfo(name = "last_name")
    private String lastName;

    public User() {
    }

    @Ignore
    public User(int uid, String firstName, String lastName) {
        this.uid = uid;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    // 此處省略了Getter/Settter方法...

}
  1. 創(chuàng)建Dao接口類,這里只演示了最基本的增刪改查劣针,這個(gè)接口不需要寫實(shí)現(xiàn)類,它的實(shí)現(xiàn)類會(huì)由 android 根據(jù)方法上的注解自動(dòng)生成
@Dao
public interface UserDao {

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

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

    @Delete
    void delete(User user);

    @Update
    void update(User user);

    @Query("DELETE FROM user")
    void deleteAll();

}
  1. 創(chuàng)建繼承自 RoomDatabase 的抽象類押搪,這個(gè)類時(shí)訪問數(shù)據(jù)庫的關(guān)鍵树酪。在這個(gè)抽象類中用注解配置與數(shù)據(jù)庫中的表相關(guān)聯(lián)的實(shí)體類,并提供返回 Dao 對象的抽象方法大州。
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {

    public abstract UserDao userDao();

}
  1. build.gradle 中配置數(shù)據(jù)庫的Schema的導(dǎo)出路徑嗅回, 如下配置的導(dǎo)出路徑為 app/schemas/
android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
            }
        }
        ...
    }
    ...
}

如果不需要導(dǎo)出Schema,可以再第四步中使用如下配置

@Database(entities = {User.class}, version = 1, exportSchema = false)
  1. 因?yàn)槭窃诮缑嬷惺褂靡粋€(gè)按鈕觸發(fā)測試代碼摧茴,所以寫在了 onClick 方法中
public class MainActivity extends AppCompatActivity {
    ...
    public void onClick(View view) {
        // 獲得 AppDatabase 的對象,傳入的第三個(gè)參數(shù)為數(shù)據(jù)庫中表的名字
        AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "user").build();
        final UserDao userDao = db.userDao();
        
        // 訪問數(shù)據(jù)庫的操作要在子線程中執(zhí)行
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                userDao.deleteAll();

                System.out.println("----------- INSERT U1 U2 -------------");
                User u1 = new User(1, "a", "b");
                User u2 = new User(2, "c", "d");
                userDao.insertAll(u1, u2);
                List<User> users = userDao.getAll();
                System.out.println(users.toString());

                System.out.println("------------- DELETE U2 --------------");
                userDao.delete(u2);
                users = userDao.getAll();
                System.out.println(users.toString());
                u1.setFirstName("aa");
                u1.setLastName("bb");


                System.out.println("------------- UPDATE U1 --------------");
                userDao.update(u1);
                users = userDao.getAll();
                System.out.println(users.toString());

            }
        });
        thread.start();
    }
    ...
}

  1. 測試結(jié)果
I/System.out: ----------- INSERT U1 U2 -------------
I/System.out: [User{uid=1, firstName='a', lastName='b'}, User{uid=2, firstName='c', lastName='d'}]
I/System.out: ------------- DELETE U2 --------------
I/System.out: [User{uid=1, firstName='a', lastName='b'}]
I/System.out: ------------- UPDATE U1 --------------
I/System.out: [User{uid=1, firstName='aa', lastName='bb'}]

8.附上源碼:https://github.com/hanyuwenn/RoomDemo

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末埂陆,一起剝皮案震驚了整個(gè)濱河市苛白,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌焚虱,老刑警劉巖购裙,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鹃栽,居然都是意外死亡躏率,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門民鼓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來薇芝,“玉大人,你說我怎么就攤上這事丰嘉『坏剑” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵饮亏,是天一觀的道長耍贾。 經(jīng)常有香客問我阅爽,道長,這世上最難降的妖魔是什么荐开? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任付翁,我火速辦了婚禮,結(jié)果婚禮上晃听,老公的妹妹穿的比我還像新娘百侧。我一直安慰自己,他們只是感情好杂伟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布移层。 她就那樣靜靜地躺著,像睡著了一般赫粥。 火紅的嫁衣襯著肌膚如雪观话。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天越平,我揣著相機(jī)與錄音频蛔,去河邊找鬼。 笑死秦叛,一個(gè)胖子當(dāng)著我的面吹牛晦溪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挣跋,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼基公,長吁一口氣:“原來是場噩夢啊……” “哼障癌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對情侶失蹤渗饮,失蹤者是張志新(化名)和其女友劉穎牵素,沒想到半個(gè)月后鼎姊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體周瞎,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年樊销,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了整慎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡围苫,死狀恐怖裤园,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情够吩,我是刑警寧澤比然,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站周循,受9級(jí)特大地震影響强法,放射性物質(zhì)發(fā)生泄漏万俗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一饮怯、第九天 我趴在偏房一處隱蔽的房頂上張望闰歪。 院中可真熱鬧,春花似錦蓖墅、人聲如沸库倘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽教翩。三九已至,卻和暖如春贪壳,著一層夾襖步出監(jiān)牢的瞬間饱亿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國打工闰靴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彪笼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓蚂且,卻偏偏與公主長得像配猫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子杏死,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理泵肄,服務(wù)發(fā)現(xiàn),斷路器淑翼,智...
    卡卡羅2017閱讀 134,652評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,806評(píng)論 6 342
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,082評(píng)論 25 707
  • 稷山縣古稱“高涼邑”凡伊,為山西省運(yùn)城市下轄縣。轄區(qū)地處華北窒舟、西北、中原三大地域連接處的山西省西南端诵盼,運(yùn)城市正北端惠豺。東...
    回望未來閱讀 1,662評(píng)論 0 0
  • 今天是2017年10月1日,我們祖國的生日风宁。事實(shí)上洁墙,當(dāng)你在國內(nèi)的時(shí)候,你很難感受到“祖國”的存在戒财。尤其是當(dāng)你...
    點(diǎn)石陳金閱讀 1,369評(píng)論 12 3