1. 程式人生 > >GreenDao教程(2):基本應用

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

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中,以把DaoConfigXxxxBeanDao.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基本教程2with結構

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教程2CAN閘道器及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