關(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)不同的需求。