GreenDao簡明教程(查詢,Querying)

2021-06-28 05:53:55 字數 4329 閱讀 1252

這是一篇關於greendao的簡明使用教程(其實就是官網tutorial的乙個大概的翻譯)。

1.基本介紹

2.實體建模

3.查詢

4.關係

查詢介面返回符合指定條件的實體物件集合.你可以使用sql組織你的查詢語句,或者採用更好的方法,使用greendao的querybuilder api.greendao的查詢也支援延遲載入結果,當結果集很大的時候,它會節省記憶體和提高效能.

1.querybuilder

querybuilder類讓你不需要寫sql來構建查詢條件.寫sql大多數人都不喜歡,並且容易出錯,因為它需要在執行時才能反饋錯誤.querybuilder容易使用並且不需要寫sql.使用它,相比只想**不容易產生bug,它的語法在編譯時候就會檢查完.以greendao為基礎的**生成的方法,使編譯時的檢查項能包括每乙個屬性的引用.

例如:查詢以joe為名,以姓排序的所有使用者.

list joes = userdao.querybuilder()

.where(properties.firstname.eq("joe"))

.orderasc(properties.lastname)

.list();

巢狀條件的例子:獲取出生在2023年10月以後名為joe的所有使用者. 我們將使用者生日對應到實體的年、月、日屬性.我們使用更正式的形式將查詢條件表達為:名是joe and(生日的年份大於1970 or(生日的年是1970 and 生日的月等於或大於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.query類和lazylist類

query類物件代表乙個可以被多次執行的查詢.當你使用querybuilder中的乙個方法來獲取結果(如乙個list()方法),querybuilder內部使用query類.如果你要以相同的條件多次查詢,你可以呼叫querybuilder的build()方法來產生乙個query,不需要執行它.

greendao支援唯一結果(0或1個結果)、和多個結果的查詢.如果你期望唯一的結果,呼叫query或者querybuilder的unique()方法,它會給你唯一的結果或者null(如果沒有找到匹配的實體).如果你的情況不允許null作為結果,呼叫uniqueorthrow(),它會保證返回非空的實體(如果沒有匹配的結果,它會丟擲daoexception異常).

如果查詢時你期望返回多個結果,你可以呼叫list...中的乙個方法:

:--:|:--:

list()|所有實體載入到記憶體.結果是乙個典型的arraylist.容易使用

listlazy()|實體根據需要載入到記憶體.一旦列表中乙個元素被使用,這個元素會被載入和快取起來,給後續重複使用.使用完後需要關閉 listlazyuncached()|乙個虛擬的實體列表:任何請求列表中的元素將會觸發從資料庫載入資料.使用後必須關閉 listiterator()|讓你使用迭代器來遍歷結果集,它根據需要載入資料(延遲載入).資料沒有快取,使用後必須關閉

listlazy、listlazyuncached和listiterator 使用了greendao的lazylist類.為了使用時才載入資料,它儲存了資料庫游標的引用.這也是使用後必須呼叫關閉方法的原因(一般在try/finally**塊中關閉).一旦所有的元素被訪問或遍歷到,listlazy()返回有快取、延遲載入列表和listiterator()返回的延遲載入迭代器會自動關閉資料庫游標.如果資料的訪問過早的結束了(沒有遍歷完全),那麼關閉資料庫游標是你要做的的工作.

3.使用queries進行多次查詢

一旦你使用querybuilder構造了乙個query,這個query物件後續可以重複使用,來執行查詢.這比總是建立新的query物件要更有效.如果查詢條件沒有變,你只需要再次呼叫其中乙個list/unique方法.如果引數有改變,你必須對改變的引數呼叫setparameter方法.目前,各個引數以0開始的索引來區分.對應你傳入引數到querybuilder的索引.

下面的例子使用query物件來查詢"名"為joe,出生在2023年的用於:

query query = userdao.querybuilder().where(

properties.firstname.eq("joe"), properties.yearofbirth.eq(1970))

.build();

list joesof1970 = query.list();

使用這個query物件,我們查詢名為marias,出生在2023年的使用者:

query.setparameter(0, "maria");

query.setparameter(1, 1977);

list mariasof1977 = query.list();

4.在多執行緒中執行查詢

如果你想在多執行緒中使用查詢,你必須對query物件呼叫forcurrentthread()方法來獲取乙個當前執行緒的query例項.從greendao1.3以後,query的例項物件繫結到構建query的執行緒中.這樣,你可以安全的對query物件設定引數而不受其他執行緒的干擾.如果其他執行緒試圖對query物件設定引數或者執行繫結在其他執行緒的查詢,greendao會丟擲異常.這樣,你就不需要使用同步語句.事實上,我們應該避免使用鎖,因為如果併發事務使用同乙個query物件,它會導致死鎖.

為了完全避免潛在的死鎖,greendao1.3引入了forcurrentthread()函式.它會返回本執行緒的query例項,它在當前執行緒可以安全的使用.每次呼叫forcurrentthread(),傳入的引數和使用querybuilder構造query的引數一致.

5.原始查詢

獲取資料,有兩種方法來執行原始的sql.比較好的方法是使用querybuilder和wherecondition.stringcondition. 使用它,你可以向querybuilder傳入任何的sql where子句片段.下面的**是乙個笨拙的方法,它讓你使用乙個select子句來起到join的效果

query query = userdao.querybuilder().where(

new stringcondition("_id in " +

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

碰到querybuilder沒有提供你需要的特性時(例如上面的join關鍵字),你可以回到原始的查詢語句或者原始查詢語句的構造方法.他們允許傳入原始sql字串,追加到select + 實體列名後面.通過這種方法,你可以拼好任意where和order by子句,來查詢資料庫中的物件.實體表名用別名"t"來稱呼:

下面的例子展示了如何使用join建立query物件,它查詢組名為"admin"的使用者群.

query query = userdao.queryrawcreate(

", group g where g.name=? and t.group_id=g._id", "admin");

注意:你可以使用生成的常量來指向表和列名.這是推薦的做法,它可以避免錯別字,因為編譯器會檢查名字.在實體對應的dao類中,你會找到tablename,它持有資料庫表的名字.dao類中還有乙個properties內部類 ,包含所有的屬性常量(對應資料庫列名).

6.刪除查詢

批量刪除會刪除符合條件的實體.想要行批量刪除,需要建立乙個querybuilder,呼叫它的builddelete方法,執行返回的deletequery.這部分的api將來可以會修改,例如,會新增便利的方法.記住,批量刪除目前不會影響identity scope中的實體,例如實體已經有快取並且是呼叫傳入id來獲取的函式,你可以"復活"他們.如果這裡給你的情況帶來一些問題,你可以考慮清除identity scope.

7.查詢查詢中的問題

你的查詢沒有返回你期望的值?這裡有2個靜態的標識,乙個是將sql語句列印出來,乙個是將傳入querybuilder的引數列印出來:

querybuilder.log_sql = true;

querybuilder.log_values = true;

這些日誌會記錄生成的sql命令和呼叫build()方法傳入的引數.這樣你可以對比他們是不是你預期的.這也幫助你們拷貝sql語句到其他資料庫瀏覽工具,並執行他們獲取結果。

Visual Unit 簡明教程

visual unit,簡稱vu,是新一代單元測試工具,功能強大,使用簡單,完全視覺化,不需編寫測試 vu的測試結果使程式行為一目了然,有助於整理程式設計思路,提高程式設計效率和正確性,並能快速排錯 vu還增強偵錯程式功能 如自由後退 用例切換 提高除錯的效率 vu能達到空前的測試完整性,輕鬆完成語...

MYSQL簡明教程

dos進入mysql命令 c mysql h 127.0.0.1 u root p enter password mysql 進入完成 建立資料庫 create database databasename 使用指定資料庫進行操作 方法1 use database databasename 方法2 m...

Struts Hibernate簡明教程

jboss 資助的開源專案,當前比較流行的持久層框架,是一種先進的 jdbc 封裝框架。優點 提高了資料訪問層的開發效率,使我們不必直接呼叫 jdbc 來訪問關係型資料庫。hibernate 建立在物件導向的基礎之上,開發人員只需針對物件進行操作,不必再關心資料庫的連線關閉,sql的執行,以及 re...