GreenDao教程(2):基本應用
1. 前言
- 主要介紹GreenDao的基本應用。
- 本文資料來源網路公開資源,並根據個人實踐見解純手打整理,如有錯誤請隨時指出。
- 本文主要用於個人積累及分享,文中可能引用其他技術大牛文章(僅引用連結不轉載),如有侵權請告知必妥善處理。
2. 應用層原理簡介
- 如果這部分看起來感覺抽象難懂,可以先看之後的實操部分,操作一遍之後再回頭看,更容易理解此部分。
2.1. 編譯後自動注入的檔案有哪些
GreenDao是什麼我想已無需多解釋,關鍵是瞭解它在一個事務發起時是怎樣去執行一系列程式碼的。
首先需要了解編譯後,GreenDao注入的java檔案,主要有哪些,功能是什麼。
- 在《GreenDao配置流程》中,schema配置了”daoPackage ‘xx.xxx.xxxxx.greendao.dao’”,當rebuild後,daoPackage所指定的包路徑下,我們可以找到自動生成的檔案有:
- DaoMaster.java
- 入口類,在任何情況下操作資料庫的入口。
- 包含註冊XxxxBeanDao類,建立DaoSession例項,操作DatabaseOpenHelper相關的建立表、刪除表、更新資料庫等操作
- 建立對映關係
- DaoSession.java
- 建立所有Bean類對應的Dao類的例項,完成對映關係
- 每個Bean類對應的Dao類
- 資料庫操作類,繼承自抽象類AbstractDao
- DaoMaster.java
2.2. 獲取一個Dao物件的過程
2.2.1. 程式碼示例:
DaoSession daoSession = new DaoMaster(new DaoMaster.DevOpenHelper(context, DATA_BASE_NAME).getWritableDb()).newSession();
daoSession.getXxxxBeanDao();
2.2.2. 分段解釋建立過程
new DaoMaster(…);
- DaoMaster類的構造方法中,傳入的Database例項使用DaoMaster中DevOpenHelper建立,自定義DATA_BASE_NAME
DaoMaster類的構造方法中,進入registerDaoClass(…)方法,可以看到這一操作實際上是將XxxxBeanDao.class加入其抽象父類AbstractDaoMaster的一個map:daoConfigMap中,以把DaoConfig和XxxxBeanDao.class繫結,如下圖:
進入DaoConfig類,可以看到,構造方法中程式碼實際上是一個建立反射機制的過程,這為每個Dao準備好TableName、Property、Pk等一系列引數。每個Dao都將建立一個對應的DaoConfig與之繫結,具體程式碼不再截圖,此類比較簡單,但非常重要,後面也會提到。
newSession();
接續上面的內容,回到DaoMaster類,看到daoConfigMap實際是用來建立DaoSession例項的引數,如下圖:
建立DaoSession例項時,進入DaoSession類的方法可以看到,呼叫了daoConfigMap的clone()方法得到所有對應Dao檔案的daoConfig,並對其建立快取入口,這個快取建立的方法是DaoConfig類中initIdentityScope(IdentityScopeType type)
- 在DaoSession建立中,將建立所有Bean類對應的Dao類的例項,並將XxxxBean.class和對應的Dao類繫結,到此為止GreenDao框架內部基本已完成了物件關係對映處理
此時可以 2.2.1. 的示例程式碼,可以輕鬆獲得Bean類的操作類XxxxBeanDao的例項。
3. 關於註解
4. 基本應用
4.1. 建立一個Bean
參看如下PeopleBean.java程式碼和註釋
//注意:準備做資料庫儲存的Bean,必須新增@Entity註解
@Entity
public class PeopleBean {
@Id
//此處有坑,務必注意
//注意:必須使用包裝型別Long,而非基本型別long
private Long id;
@NotNull
private String name;
private int age;
private String province;
private boolean isMale;
@Unique
private String idCard;
//注意:get、set方法,無需自己生成,當此類建立完成後,rebuild專案,將自動生成
//注意:toString是需要自己建立生成的
@Override
public String toString() {
return "PeopleBean{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", province='" + province + '\'' +
", isMale=" + isMale +
", idCard='" + idCard + '\'' +
'}';
}
}
4.2. 獲取Dao例項
前提:rebuild專案
4.2.1. 獲取DaoSession例項
- 需要注意的是,DaoSession例項包含該專案中所有已被@Entity註解的Bean所建立的Dao類例項,故DaoSession例項最好為單例模式,並加鎖
- 或者,將DaoSession建立在該工程的Application類中,也可以形成事實上的單例
這裡示例程式碼展示建立一個單例的工具類,用來獲取DaoSession例項:
public class GreenDaoUtil {
private static DaoSession daoSession;
private final static String DATA_BASE_NAME = "test_01.db";
public synchronized static DaoSession getDaoSession(Context context) {
if (daoSession == null) {
daoSession = new DaoMaster(new DaoMaster.DevOpenHelper(context, DATA_BASE_NAME).getWritableDb()).newSession();
}
return daoSession;
}
}
4.2.2. 獲取Dao例項
GreenDaoUtil.getDaoSession(activity).getPeopleBeanDao();
4.2.3. Dao操作增刪改查示例
複雜應用不一一示例,後面系列文章將逐漸體現
GreenDaoUtil.getDaoSession(activity).getPeopleBeanDao().insert(peopleBean);
GreenDaoUtil.getDaoSession(activity).getPeopleBeanDao().deleteByKey(peopleBean.getId());
GreenDaoUtil.getDaoSession(activity).getPeopleBeanDao().update(peopleBean);
//全部
List<PeopleBean> peopleBeanList = GreenDaoUtil.getDaoSession(activity).getPeopleBeanDao()
.queryBuilder()
.list();
//條件查
List<PeopleBean> peopleBeanList = GreenDaoUtil.getDaoSession(activity).getPeopleBeanDao()
.queryBuilder()
.where(PeopleBeanDao.Properties.Age.gt(30), PeopleBeanDao.Properties.IsMale.eq(true))
.list();
注意:
查詢方法返回的 List,從原始碼上看,永不為null,可以省略對其null判斷,直接foreach使用
5. 結語
這一部分基本沒有什麼坑,比較簡單,還是總結下關鍵點,如下:
- 對於應用層的一些較淺層原始碼,最好還是熟悉下,便於以後的應用
- 對註解的需要熟悉
- 主鍵Id,必須包裝類Long型,避免各種坑
- DaoSession例項需要單例
- 當Bean變數被改變(或任何涉及資料庫的改變),rebuild後資料庫對應的表結構也會隨之改變,這時必須schema配置必須將schemaVersion +1
相關推薦
GreenDao教程(2):基本應用
1. 前言 主要介紹GreenDao的基本應用。 本文資料來源網路公開資源,並根據個人實踐見解純手打整理,如有錯誤請隨時指出。 本文主要用於個人積累及分享,文中可能引用其他技術大牛文章(僅引用連結不轉載),如有侵權請告知必妥善處理。 2.
tensorflow基本教程2:with結構
import tensorflow as tf #with 結構與不用with結構: #1.不用with結構需要自己關閉程式 #2.with不用自己關閉 matrix1=tf.constant([[3,3]]) matrix2=tf.constant([[2],[2]]) product=t
Nginx 系列實用教程 #2:性能
信息 標識 調整 個數字 font cdn 綁定 gin pro 家好,分享即關愛,我們很樂意和你分享一些新的知識,我們準備了一個 Nginx 的教程,分為三個系列,如果你對 Nginx 有所耳聞,或者想增進 Nginx 方面的經驗和理解,那麽恭喜你來對地方了。 我們會告
嘴哥有料系列-can教程2:CAN閘道器及CAN訊號轉發機制
原文章:https://mp.weixin.qq.com/s/qbUcZngSDClx9Ll5aKvlLg 上節課, 我們講到了CAN閘道器, 其實準確的說不能叫CAN閘道器, 應該叫閘道器或者汽車閘道器, 因為閘道器不僅處理CAN網路, 還處理LIN網路. 主
易學筆記-RabbitMQ教程2:一個生產者和多個消費者
易學筆記 十年IT經驗個人學習筆記分享: 開發語言:C/C++/JAVA/PYTHON/GO/JSP WEB架構:Servlets/springMVC/springBoot/springClound 容器架構:Docker容器/Docker叢集/Docker與微服務整合/
【TensorFlow學習筆記】2:基本使用流程和使用檢查點,按照時間自動管理檢查點
學習《深度學習之TensorFlow》時的一些實踐。 TF的基本使用 對於分類問題的特徵X和標籤Y,分別定義tf.placeholder,這是計算圖輸入資料的入口。 對於模型中的引數(注意不是超引數),如往往是權向量w和偏置b,定義tf.Variable,並傳入初始的值
React 系列教程2:編寫蘭頓螞蟻演示程式
簡介 最早接觸蘭頓螞蟻是在做引數化的時候,那時候只感覺好奇,以為是很複雜的東西。因無意中看到生命遊戲的 React 實現,所以希望通過蘭頓螞蟻的例子再學習一下 React。 蘭頓螞蟻的規則非常簡單: 如果螞蟻位於白色方塊,則向右旋轉 90°,反轉方塊的顏色,然後向前移動一步。 如果螞蟻位於黑色方塊,則向
#地圖故事#教程2:如何製作分級顏色地圖
新增資料 在首頁點選“製圖地圖”導航欄或滾動圖片上的“開始製圖”按鈕,就可以線上製作地圖了。 第一:選擇模板。在“分級顏色地圖”處,預設選擇以點繪製資料,這裡選擇以面繪製資料,然後點選“開始製作”。 第二:新增資料。可以選擇“上傳檔案”,也可以選擇“線上填寫”。這裡選
vue專案實踐教程2:使用vux設計登入註冊,並講解vue路由,切換頁面標題等內容
上一章筆者介紹vux專案的搭建和簡介,這裡筆者設計幾個登入註冊頁面,來講解vux中的相關元件的使用,和vue的相關基礎知識。 1.我們在與components資料夾同級的目錄下建立一個views資料夾,資料夾中再建立一個user資料夾,用於存放和使用者相關的頁
GreenDao教程(3):一對一,一對多,多對多
1. 前言 主要介紹GreenDao 一對一,一對多,多對多應用 這部分還是有些坑的,注意看示例程式碼中註釋即可避開 本文資料來源網路公開資源,並根據個人實踐見解純手打整理,如有錯誤請隨時指出。 本文主要用於個人積累及分享,文中可能引用其他技術大牛
Java基礎2:基本數據類型與常量池
cache model ria 比較 是否 類型 misc pri pan Java基礎2:基本數據類型與常量池 基本數據類型的大小 int 32位 4字節 short 16位float 32位double 64位long 64位char 16位byte 8位boolea
Git使用教程2:版本庫的建立和新增檔案
上篇部落格,我們一起了解了分散式版本控制系統Git的簡單內容,知道了分散式版本控制的優勢,同時也給大家分享了Git的安裝過程。本篇博文和大家一起討論,Git版本庫的建立和簡單操作。
MVC5+EF6 入門完整教程2 :從前端UI開始
從前端的UI開始MVC分離的比較好,開發順序沒有特別要求,先開發哪一部分都可以,這次我們主要講解前端UI的部分。ASP.NET MVC拋棄了WebForm的一些特有的習慣,例如伺服器端控制元件,ViewState這些東西,讓Web迴歸原始的狀態,Web是什麼樣子就是什麼樣子。
Android OpenGL ES 開發教程(8):基本幾何圖形定義
通常二維圖形庫可以繪製點,線,多邊形,圓弧,路徑等等。OpenGL ES 支援繪製的基本幾何圖形分為三類:點,線段,三角形。也就是說OpenGL ES 只能繪製這三種基本幾何圖形。任何複雜的2D或是3D圖形都是通過這三種幾何圖形構造而成的。 比如下圖複雜的3D圖形,都有
PyQt5學習教程2:給窗體加上圖示
上1篇教程,只是對PyQt5使用的初步演示,其框架沒有具體的使用意義。本篇教程將構建1個具有實際使用價值的最簡框架,相對於上一篇教程所講解的窗體所具有的功能,我們將給窗體增加一個圖示,就如同大部分程式一樣,將顯示在窗體的左上角位置。圖示檔案可以使用很多中型別,本文采用的是p
在.NET Core中使用MongoDB明細教程(2):使用Filter語句檢索文件
![](https://img2020.cnblogs.com/blog/1377250/202008/1377250-20200817205743501-2104066641.png) 在上篇文章我們介紹了一些驅動程式相關的基礎知識,以及如何將文件插入到集合中。在這篇文章中,我們將學習如何從資料庫中檢索文
ArcEngine10.2設計與開發課程學習(作業二)——基本應用程式生成,右擊選單實現:顯示、移除和開啟屬性表功能
前言:這裡是我的筆記本 目錄: 準備工作——工具方法等 程式碼 首先說明一下第一個作業,這是第二個的連結:https://pan.baidu.com/s/1NziPHoMEJx0vc8DCNrX-dA提取碼:qpee 看的時候希望能夠靜下心來看,不要著急
Zend Studio使用教程:將應用程式部署到Zend Server(1/2)
Zend Studio允許您從現有的SVN專案中建立一個新的PHP專案。在本教程中,您將獲的一個現有的SVN專案。 教程內容 在本教程中,您將學習: 從Zend Studio中的SVN建立一個新的PHP專案,您將獲得一個現有的SVN帳戶和專案。在本地Zend Ser
實驗2:棧和佇列的基本操作實現及其應用
一、實驗目的1、 熟練掌棧和佇列的結構特點,掌握棧和佇列的順序儲存和鏈式儲存結構和實現。2、 學會使用棧和佇列解決實際問題。二、實驗內容1、自己確定結點的具體資料型別和問題規模:分別建立一個順序棧和鏈棧,實現棧的壓棧和出棧操作。分別建立一個順序佇列和鏈佇列,實現佇列的
Python簡明教程:基本概念
python1 字面意義上的常量,如2、‘This is ok‘這樣的字符串>>> print(‘a,2,3‘)a,2,32 字符串單引號(‘)使用單引號指示字符串,類似shell中的強引用,所有的空格、制表符照原樣保留。>>> print(‘This is ok‘)Thi