學(xué)習(xí)Room時(shí)使用的AsyncTask柜蜈、Dao仗谆、Database、Entity詳解

1.AsyncTask抽象類

功能

AsyncTask 屬于安卓中實(shí)現(xiàn)多線程的一種方法淑履,可以在該線程中實(shí)施耗時(shí)方法隶垮,比如數(shù)據(jù)庫查詢。也可以實(shí)現(xiàn)工作線程和主線程之間的通信秘噪。

類別:

屬于抽象(abstract)類狸吞,使用時(shí)需extends。

參數(shù):

含有三個(gè)泛型參數(shù):

public abstract class AsyncTask<Params, Progress, Result> { ... }

// 類中參數(shù)為3種泛型類型

// 整體作用:控制AsyncTask子類執(zhí)行線程任務(wù)時(shí)各個(gè)階段的返回類型

// 具體說明:

// a. Params:開始異步任務(wù)執(zhí)行時(shí)傳入的參數(shù)類型指煎,對(duì)應(yīng)excute()中傳遞的參數(shù)

// b. Progress:異步任務(wù)執(zhí)行過程中蹋偏,返回下載進(jìn)度值的類型

// c. Result:異步任務(wù)執(zhí)行完成后,返回的結(jié)果類型至壤,與doInBackground()的返回值類型保持一致

// 注:

// a. 使用時(shí)并不是所有類型都被使用

// b. 若無被使用威始,可用java.lang.Void類型代替

// c. 若有不同業(yè)務(wù),需額外再寫1個(gè)AsyncTask的子類}


核心方法


使用順序

2.Dao

interactions 交互? ?compile 編譯

以下是官網(wǎng)的描述:

Marks the class as a Data Access Object.

Data Access Objects are the main classes where you define your database interactions. They can include a variety of query methods.

數(shù)據(jù)接入對(duì)象是一個(gè)你定義你與你的數(shù)據(jù)庫交互的主類像街,他們中有各種各樣的查詢方法黎棠。

The class marked with?@Dao?should either be an interface or an abstract class. At compile time, Room will generate an implementation of this class when it is referenced by a?Database.

這個(gè)類應(yīng)當(dāng)被@Dao標(biāo)記,并且應(yīng)該是一個(gè)接口或者抽象類镰绎。在編譯的時(shí)候脓斩,Room會(huì)產(chǎn)生該類的實(shí)現(xiàn),當(dāng)它被數(shù)據(jù)庫引用的時(shí)候畴栖。

An abstract?@Dao?class can optionally have a constructor that takes a?Database?as its only parameter.

一個(gè)@Dao的抽象類能選擇性的有一個(gè)把數(shù)據(jù)庫當(dāng)作其唯一參數(shù)的構(gòu)造方法随静。

It is recommended to have multiple?Dao?classes in your codebase depending on the tables they touch.

根據(jù)他們關(guān)聯(lián)的表格,建議在你的代碼庫中有個(gè)復(fù)合的Dao類吗讶。

查詢操作很重要燎猛,可以結(jié)合SQL語句實(shí)現(xiàn)非常有針對(duì)性的查詢:

3.Database

alter?更改;修改? ?mandatory 強(qiáng)制的

Marks a class as a RoomDatabase.

標(biāo)記為RoomDatabase類

The class should be an abstract class and extend?RoomDatabase.

這個(gè)類應(yīng)該為一個(gè)繼承RoomDatabase的抽象類

You can receive an implementation of the class via?Room.databaseBuilder?or?Room.inMemoryDatabaseBuilder.

你能通過Room.databaseBuilder?or?Room.inMemoryDatabaseBuilder.這兩種方式接受到一個(gè)本類的實(shí)現(xiàn)关翎。

// Song and Album are classes annotated with @Entity.

@Database(version = 1, entities = {Song.class, Album.class})

abstract class MusicDatabase extends RoomDatabase {

// SongDao is a class annotated with @Dao.

abstract public SongDao getSongDao();

// AlbumDao is a class annotated with @Dao.

abstract public ArtistDao getArtistDao();

// SongAlbumDao is a class annotated with @Dao.

abstract public SongAlbumDao getSongAlbumDao(); }

The example above defines a class that has 2 tables and 3 DAO classes that are used to access it.?

在上面的引用中扛门,定義了一個(gè)數(shù)據(jù)庫類,其中有2個(gè)表格和3個(gè)Dao類去接入它纵寝。

There is no limit on the number of?Entity?or?Dao?classes but they must be unique within the Database.

實(shí)體和Dao在數(shù)據(jù)庫中的數(shù)目是沒有限制的论寨,但是他們?cè)谶@個(gè)數(shù)據(jù)庫中必須是唯一的星立。

Instead of running queries on the database directly, you are highly recommended to create?Dao?classes. Using Dao classes will allow you to abstract the database communication in a more logical layer which will be much easier to mock in tests (compared to running direct SQL queries). It also automatically does the conversion from?Cursor?to your application data classes so you don't need to deal with lower level database APIs for most of your data access.

上面這段話的大概意思是,除非你直接對(duì)數(shù)據(jù)庫使用查詢操作葬凳,否則绰垂,強(qiáng)烈建議你在數(shù)據(jù)庫類中創(chuàng)建一個(gè)Dao類,這能大幅度提升你的效率火焰,從而避免了直接去使用復(fù)雜的操作數(shù)據(jù)庫的語言劲装。

Room also verifies all of your queries in?Dao?classes while the application is being compiled so that if there is a problem in one of the queries, you will be notified instantly.

Room在應(yīng)用編譯的時(shí)候會(huì)在Dao中核驗(yàn)?zāi)闼械牟樵儾僮鳎@樣昌简,一旦有問題出現(xiàn)占业,你能夠馬上察覺到。

其參數(shù)纯赎,即@Database后面括號(hào)呢的參數(shù):

entities谦疾、version、exportSchema犬金、views

4.Entiy


重點(diǎn):

1念恍、一個(gè)Entity對(duì)象代表數(shù)據(jù)表中的一行,一個(gè)Entity類代表一張數(shù)據(jù)表晚顷。

2峰伙、Entity中的成員變量都是數(shù)據(jù)表中的列。

3该默、一個(gè)Java類定義成Entity只要加上Entity注解就可以了瞳氓。

主鍵Primary Key:每一個(gè)Entity至少定義一個(gè)主鍵(primary key),哪怕Entity中只有一個(gè)變量也要將這個(gè)變量定義為主鍵权均,在Room數(shù)據(jù)庫中使用注解 @PrimaryKey 來定義主鍵顿膨,@PrimaryKey 的使用方式有兩種一種是在類變量前面加,如果主鍵比較復(fù)雜可以加在@Entity注解的后面叽赊。

列名:和改變表名稱tableName一樣恋沃,可以改變表中的列名稱,使用 @ColumnInfo來改變列的名稱必指。如果不改的話默認(rèn)使用變量名的小寫形式囊咏。(注意:前面說了,Entity類中所有的變量都是數(shù)據(jù)表中的列塔橡。

使某些變量不生成數(shù)據(jù)表中的字段:由上面可知當(dāng)一個(gè)類前加了Entity注解后類中的所有成員變量都會(huì)生成表中的屬性列梅割,如果我們不希望某個(gè)變量生成表中的屬性列,可以使用注解 @Ignore葛家。


ingnore

嵌套Entity:

如果定義的Entity類里面有個(gè)實(shí)體對(duì)象户辞,并且希望定義的Entity中的表列字段包含該Entity類對(duì)象中的變量,可以在Entity類對(duì)象中加@Embedded標(biāo)注癞谒。

這樣就可以實(shí)現(xiàn)實(shí)體之間的組合底燎。


@Embedded



app使用

application從RoomDatabase中獲取DAO實(shí)例刃榨,并且通過DAO中定義的方法來操作數(shù)據(jù)庫中Entity。獲取設(shè)置entity的數(shù)據(jù)双仍。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末枢希,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子朱沃,更是在濱河造成了極大的恐慌苞轿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逗物,死亡現(xiàn)場(chǎng)離奇詭異搬卒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)敬察,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門秀睛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尔当,“玉大人莲祸,你說我怎么就攤上這事⊥钟” “怎么了锐帜?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)畜号。 經(jīng)常有香客問我缴阎,道長(zhǎng),這世上最難降的妖魔是什么简软? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任蛮拔,我火速辦了婚禮,結(jié)果婚禮上痹升,老公的妹妹穿的比我還像新娘建炫。我一直安慰自己,他們只是感情好疼蛾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布肛跌。 她就那樣靜靜地躺著,像睡著了一般察郁。 火紅的嫁衣襯著肌膚如雪衍慎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天皮钠,我揣著相機(jī)與錄音稳捆,去河邊找鬼。 笑死麦轰,一個(gè)胖子當(dāng)著我的面吹牛乔夯,可吹牛的內(nèi)容都是我干的期虾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼驯嘱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼镶苞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鞠评,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤茂蚓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后剃幌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體聋涨,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年负乡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了牍白。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抖棘,死狀恐怖茂腥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情切省,我是刑警寧澤最岗,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站朝捆,受9級(jí)特大地震影響般渡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芙盘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一驯用、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧儒老,春花似錦蝴乔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巩剖,卻和暖如春铝穷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背佳魔。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工曙聂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鞠鲜。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓宁脊,卻偏偏與公主長(zhǎng)得像断国,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子榆苞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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