Room使用筆記

關(guān)于Room在項(xiàng)目中怎么使用請(qǐng)看:http://www.itdecent.cn/p/5ba249216e83

1.在主線程中使用Room操作數(shù)據(jù)

Room默認(rèn)不許在主線中對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行增刪查改等操作,我們需要將操作放在異步線程中去執(zhí)行,但是有時(shí)候我們?cè)跀?shù)據(jù)庫(kù)中存的只是少量的數(shù)據(jù),每次都使用線程來(lái)進(jìn)行操作顯得太麻煩,那么就需要設(shè)置Room可以在主線中進(jìn)行操作。
其實(shí)要在主線程中使用Room很簡(jiǎn)單,只需要在build數(shù)據(jù)庫(kù)對(duì)象時(shí)使用allowMainThreadQueries()方法即可

TestRoomDatabase trdb = Room.databaseBuilder(context, TestRoomDatabase.class, "test.db")
                            .allowMainThreadQueries()
                            .build();

2.Room對(duì)數(shù)據(jù)庫(kù)進(jìn)行版本升級(jí)

在使用SQLiteOpenHelper時(shí)我們可以在onUpgrade中來(lái)執(zhí)行數(shù)據(jù)庫(kù)的升級(jí)操作。那么使用Room時(shí)怎么做呢?首先vision版本+1,然后在相應(yīng)實(shí)體類(lèi)中添加需要增加的字段(數(shù)據(jù)庫(kù)表增加字段)或者創(chuàng)建一個(gè)新的實(shí)體類(lèi)(增加一張表)并引用這個(gè)實(shí)體。是不是這樣就可以了呢?然而并不是,我們需要對(duì)新增的字段或者新增的表執(zhí)行相應(yīng)的SQL語(yǔ)句才能對(duì)數(shù)據(jù)庫(kù)進(jìn)行我們需要的改動(dòng),那在Room中怎么去執(zhí)行這些語(yǔ)句呢?Migration可以完成我們的需求。

Migration的創(chuàng)建,其中1和2表示vision從1升級(jí)到2

private Migration mMigration_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
                //TODO 執(zhí)行對(duì)應(yīng)的SQL語(yǔ)句
        }
    };

Migration的使用

TestRoomDatabase trdb = Room.databaseBuilder(context, TestRoomDatabase.class, "test.db")
                            .addMigrations(mMigration_1_2)
                            .build();
//同樣可以添加多個(gè)
1、addMigrations(mMigration_1_2, mMigration_2_3,...)
2、addMigrations(Migration數(shù)組)

3.Room根據(jù)條件刪除

Room中Dao默認(rèn)提供的Delete標(biāo)簽實(shí)現(xiàn)如下:

@Delete
void delete(Test test);
@Delete
void delete(List<Test> tests);

通過(guò)以上方法我們只能刪除我們傳入的相應(yīng)對(duì)象的關(guān)鍵字多對(duì)應(yīng)的數(shù)據(jù),如果我們需要根據(jù)某個(gè)條件來(lái)刪除的話以上方法的實(shí)現(xiàn)就不太友好(只能先查出符合要?jiǎng)h除條件的對(duì)象,然后再調(diào)用以上的方法進(jìn)行刪除);那么有沒(méi)有更好的實(shí)現(xiàn)方式呢?其實(shí)Dao中還有@Query標(biāo)簽,雖然看上去標(biāo)簽是用于查詢數(shù)據(jù)的,但是利用該標(biāo)簽可以執(zhí)行自定義的SQL語(yǔ)句的特性,我們同樣可以使用該標(biāo)簽來(lái)執(zhí)行我們的刪除語(yǔ)句。

假設(shè)test表中有count字段,我們要?jiǎng)h除所有count等于某個(gè)值的數(shù)據(jù),實(shí)現(xiàn)如下:

@Query("DELETE FROM test WHERE count = (:count)")
void deleteByCount(int count)

其中(:count)表示對(duì)傳入?yún)?shù)的引用,左右括號(hào)可以不要。

其實(shí)有了@Query標(biāo)簽,我們可以執(zhí)行任意的SQL語(yǔ)句來(lái)實(shí)現(xiàn)不同的需求。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容