greenDAO講義(二) 資料庫查詢篇

2021-07-09 13:10:12 字數 3389 閱讀 6625

1. 查詢 -- queries

1)你可以使用原生的sql(raw sql)語句;

2)也可以使用推薦的方法:使用greendao提供的querybuilder的api。

3)查詢還支援結果延遲載入(lazy-loading),主要為操作較大查詢結果是節約記憶體並提高效能。

(1)querybuilder

使用過sql語句查詢的人都會有一種感觸(主要針對不是專職開發資料庫並對sql不是很熟練的人),寫起來複雜、不能再第一時間發現問題(只能在執行過程中驗證sql的正確性)、查詢bug麻煩等等。querybuilder的出現就是為了解決sql使用的問題,提高開發效率。

看乙個略微複雜的例子,查詢first name是joe,並在2023年10月以及之後的所有人:

querybuilder qb 

=userdao.

querybuilder()

; qb.

where

(properties

.firstname.eq

("joe"),

qb.or(

properties

.yearofbirth.gt

(1970),

qb.and(

properties

.yearofbirth.eq

(1970), 

properties

.monthofbirth.ge

(10))

));

list

youngjoes 

=qb.

list()

;

不用我來解釋了吧。

(2)lazylist

greendao支援返回唯一查詢結果(如果沒有返回null) ---- 呼叫query或querybuilder的unique()方法;

也支援返回list ---- 呼叫list()方法。

當不希望返回null作為結果時,則呼叫uniqueorthrow()方法,當結果null時將直接丟擲異常。

返回多個結果解釋:

list():     所有entity均會被載入到記憶體中。結果僅是乙個簡單的arraylist。使用最簡單。

listlazy():    查詢結果會根據需要載入到記憶體中。列表中的元素僅在accessed for the first time,它才會被載入並快取。該方法必須主動關閉(must be closed)。

listlazyuncached():    虛擬的結果列表,任何對元素的方法實際都會到資料庫中去載入資料。must be closed

listiterator():    根據需要迭代結果(lazily)。資料不快取。must be closed

在greendao實現中,後3中其實都使用的lazylist類。為了實現根據需要載入,其內部實現上是儲存了資料庫cursor的引用。這也是為何這3中方式must be closed,其就是為了釋放內部cursor和迭代器(通常是在try-finally塊中完成close)。

(3)query

解釋:query類代表了乙個可以被重複執行的查詢。在querybuilder內部其實也是會定義乙個query並執行完成查詢。

這將帶來極大地方便,因為任何人都不希望在每次查詢的時候總是寫一遍query**。同時query還可以根據需要改變引數。如下例項**:

使用query物件查詢名為joe並出生在2023年的人:

query query 

=userdao.

querybuilder()

.where(

properties

.firstname.eq

("joe"), 

properties

.yearofbirth.eq

(1970))

.build()

; list

joesof1970 

=query.

list()

;

然後想再查詢出生在2023年之後並叫marias的人:

query.

setparameter(0

, "maria");

query.

setparameter(1

, 1977);

list

mariasof1977 

=query.

list()

;

注意:引數的編號是建立query所設定的順序。

(4)多執行緒查詢

有時我們希望在多執行緒中執行查詢。從greendao 1.3版本開始,例項化

query物件均會繫結到其自己的執行緒,這樣我們就可以安全的設定query引數,因為其他執行緒無法影響到。如果其他執行緒使用別的執行緒的query(比如設定引數、執行查詢)將會丟擲異常。因此,我們也不需要做同步工作,而且不要加鎖,因為加入相關的事務用到了該query物件將導致死鎖。

為完全地避免可能產生的死鎖,1.3版本引入了forcurrentthread()方法。該方法將返回本執行緒內的query例項,每次呼叫該方法時,引數均會被重置為最初建立時的一樣。

(5)原生sql查詢

推薦的方法執行原生sql語句是通過querybuilder和wherecondition.stringcondition。如下**:

query query 

=userdao.

querybuilder()

.where(

newstringcondition

("_id in "

+ "(select user_id from user_message where read_flag = 0)").

build()

;

假如querybuilder沒有提供你需要的特性,你也可以使用queryraw() 和 queryrawcreate() 方法。具體就不再詳細介紹了。

(6)刪除操作(delete query)

刪除操作會刪除所有滿足條件的實體。為實現批量刪除(bulk delete),呼叫querybuilder的 builddelete方法並執行deletequery。該部分api還不穩定,可能會改變就不介紹了。

(7)問題定位(日誌)

你可能會遇到查詢結果並不是預期的那樣,這時候你就可以設定兩個靜態flag引數來打日誌定位問題:

querybuilder.

log_sql

=true

;

querybuilder.

log_values

=true

;

這將會將產生的sql命令以及傳遞的引數以日誌方式輸出,由此方便程式設計師定位問題。

Android 使用資料庫GreenDao

implementation group org.greenrobot name greendao version 3.3.0 import org.greenrobot.greendao.annotation.entity import org.greenrobot.greendao.annota...

(二)GreenDao3 0的資料庫公升級

public class migrationhelper 生成臨時表,儲存舊的表資料 param db param daoclasses private static void generatetemptables database db,class daoclasses 檢測table是否存在 p...

Android資料庫GreenDao的使用

最近公司的專案中需要使用到資料庫,使用裡greendao的資料庫後,覺得非常好用,速度快,輕量級,簡單,省略裡寫增刪改查的 今天分享給大家。具體的實現過程如下 1.新增依賴 1 需要在專案 project 的build.gradle中加入依賴 buildscript public daosessio...