Room

三個部分:Entitiy,Dao,Database,

Entity

SQLite表的映射類,每個Entity至少有一個主鍵(定義主鍵有兩種方式);至少有一個無參構造方法或參數基于類型和名稱匹配屬性的構造方法。構造參數不必接受所有屬性作為參數,如果一個屬性沒有在構造參數被賦值,它應該被public修飾或有一個被public修飾的setter方法。如果有匹配的構造參數,Room將總是使用它,如果你不想使用它,使用@Ignore標記。如果不想持久化某些屬性,也可以使用@Ignore標記這些屬性。

@Entity

用于標記要被持久化的類。
tableName:該類在SQLite中對應的表名,默認為類名。
indices:表中索引的集合(不懂什么作用)。
inheritSuperIndices:默認false,當設置為true時,該類繼承樹上所有父類的屬性也會被保存到這個實體中,即使父類的該值設置為false。當從父類繼承一個index后會根據@Index對其重命名,因為SQLite不允許在多個表中使用相同index名。
primaryKeys:聲明任意數量主鍵,默認為空。
ForeignKey:聲明外鍵約束。

@Index

用于給Entity聲明一個索引。添加索引通常會使選擇操作更快,但會使其他操作變慢,例如插入或更新。
有兩種設置Index,用于@ColumnInfo中或@Entity中。
通過@Embedded嵌入到其它實體中的Index,需要重新聲明。
默認情況下,父類的Index也不會被繼承,需要重新聲明,或將子類的inheritSuperIndices設置為true

@ForeignKey

是什么?什么作用?

Dao

數據庫訪問對象(Data Access Object),定義與數據庫交互的查詢方法。在Room中,有Query,Delete,Insert三種操作。

@Dao

用于標記dao接口,包含了一系列對數據庫對操作。

@Query

用于標記dao中用于查詢操作的方法。引用java方法參數的方式是冒號加上參數名:

@Query("SELECT * FROM comments WHERE productId = :productId")
LiveData<List<CommentEntity>> loadComments(int productId);

也可以引用數組,方法如下:

@Query("SELECT * FROM user WHERE uid IN(:userIds)")
public abstract List  findByIds(int[] userIds);

該注解支持三種操作:SELECT, UPDATE 和 DELETE。
對于SELECT操作,方法的返回值可以為單獨的Java對象,也可以是數組,集合,Cursor和LiveData。如果使用RxJava2,可以返回Flowable<T>或Publisher<T>。
UPDATE和DELETE操作可以返回void或int。int值為該操作影響到的行數。

@Delete

參數必須是被@Entity標記的類或它的集合:

@Dao
public interface MyDao {
   @Delete
   public void deleteUsers(User... users);
   @Delete
   public void deleteAll(User user1, User user2);
   @Delete
   public void deleteWithFriends(User user, List<User> friends);
}
@Insert

參數必須是被@Entity標記的類或它的集合。

Database

數據庫的抽象層,持有了眾多Dao的引用。

@Database

標記一個被abstract修飾并繼承RoomDatabase的類為Database。
entities:傳入所有Entity的class對象;
version:數據庫版本號。
exportSchema:設置是否導出數據庫schema,默認為true,需要在build.gradle中設置:

android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = ["room.schemaLocation":
                             "$projectDir/schemas".toString()]
            }
        }
    }
}

通過Room.databaseBuilderRoom.inMemoryDatabaseBuilder獲得該類的實現類:

AppDatabase db = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, AppDatabase.DATABASE_NAME).build();

用法:

db.beginTransaction();
try {
    db.productDao().insertAll(products);
    db.commentDao().insertAll(comments);
    db.setTransactionSuccessful();
} finally {
    db.endTransaction();
}

類型轉換

下面的方法將Date對象轉換為Long型的時間戳:

public class DateConverter {
    @TypeConverter
    public static Date toDate(Long timestamp) {...}
    ...
}

使用@TypeConverters注解在Database類上聲明:

@Database(...)
@TypeConverters(DateConverter.class)
public abstract class AppDatabase extends RoomDatabase {...}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容