Android GreenDao使用教程

前言

GreenDao是一款操作數據庫的神器,經過了2.0版本的升級后,已經被廣泛的開發者使用。確實是很好用,入門簡單,可以剩去了數據庫的建表操作和數據庫SQL的編寫

GreenDao3.2的配置

一、需要在工程(Project)的build.gradle中添加依賴

repositories {
    google()
    jcenter()
}
dependencies {
    classpath 'com.android.tools.build:gradle:3.2.1'
    //GreenDao3依賴
    classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
}

二、在項目(Module)的build.gradle中添加依賴

apply plugin: 'com.android.application'
//使用greendao
apply plugin: 'org.greenrobot.greendao'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.zhao.fly"
        minSdkVersion 23
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    //greendao配置
    greendao {
        //版本號,升級時可配置
        schemaVersion 1
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    //greendao依賴
    compile 'org.greenrobot:greendao:3.2.2'
}

到這里就配置成功了

GreenDao3.2的使用

一、創建Bean對象(表名和字段名)
GreenDao需要創建Bean對象之后,該Bean對象就是表名,而它的屬性值就是字段名,其實現是通過注釋的方式來實現的,下面是學生的Bean對象(每個Bean對象對應一張表)

@Entity
public class Student {
    //不能用int
    @Id(autoincrement = true)
    private Long id;
    //姓名
    @NotNull
    private String name;
    //學號
    @Unique
    private String number;
    //性別
    private int sex;
}

這里需要注意的是,創建完成之后,需要build gradle來完成我們的代碼自動生成。自動生成的代碼有:
1.Bean實體的構造方法和get、set方法
2.DaoMaster、DaoSession、DAOS類

這里對Bean對象的注釋進行解釋:
@Entity:告訴GreenDao該對象為實體,只有被@Entity注釋的Bean類才能被dao類操作
@Id:對象的Id,使用Long類型作為EntityId,否則會報錯。(autoincrement = true)表示主鍵會自增,如果false就會使用舊值
@Property:可以自定義字段名,注意外鍵不能使用該屬性
@NotNull:屬性不能為空
@Transient:使用該注釋的屬性不會被存入數據庫的字段中
@Unique:該屬性值必須在數據庫中是唯一值
@Generated:編譯后自動生成的構造函數、方法等的注釋,提示構造函數、方法等不能被修改

二、創建數據庫(數據庫名)
先定義一個DaoManager類以此方便對數據庫進行一系列的操作

public class DaoManager {
    private static final String DB_NAME = "student.db";//數據庫名稱
    private volatile static DaoManager mDaoManager;//多線程訪問
    private static DaoMaster.DevOpenHelper mHelper;
    private static DaoMaster mDaoMaster;
    private static DaoSession mDaoSession;
    private Context context;

    /**
     * 使用單例模式獲得操作數據庫的對象
     */
    public static DaoManager getInstance() {
        DaoManager instance = null;
        if (mDaoManager == null) {
            synchronized (DaoManager.class) {
                if (instance == null) {
                    instance = new DaoManager();
                    mDaoManager = instance;
                }
            }
        }
        return mDaoManager;
    }

    /**
     * 初始化Context對象
     */
    public void init(Context context) {
        this.context = context;
    }

    /**
     * 判斷數據庫是否存在,如果不存在則創建
     */
    public DaoMaster getDaoMaster() {
        if (null == mDaoMaster) {
            mHelper = new DaoMaster.DevOpenHelper(context, DB_NAME, null);
            mDaoMaster = new DaoMaster(mHelper.getWritableDatabase());
        }
        return mDaoMaster;
    }

    /**
     * 完成對數據庫的增刪查找
     */
    public DaoSession getDaoSession() {
        if (null == mDaoSession) {
            if (null == mDaoMaster) {
                mDaoMaster = getDaoMaster();
            }
            mDaoSession = mDaoMaster.newSession();
        }
        return mDaoSession;
    }

    /**
     * 設置debug模式開啟或關閉,默認關閉
     */
    public void setDebug(boolean flag) {
        QueryBuilder.LOG_SQL = flag;
        QueryBuilder.LOG_VALUES = flag;
    }

    /**
     * 關閉數據庫
     */
    public void closeDataBase() {
        closeHelper();
        closeDaoSession();
    }

    public void closeDaoSession() {
        if (null != mDaoSession) {
            mDaoSession.clear();
            mDaoSession = null;
        }
    }

    public void closeHelper() {
        if (mHelper != null) {
            mHelper.close();
            mHelper = null;
        }
    }
}

說明:這里主要是通過單列模式創建DaoManager,DaoMaster,DaoSession對象,進行初始化以及關閉數據庫操作。

三、數據庫的增刪改查
這里Student的增刪查改封裝在Utils中,其具體代碼如下所示

public class StudentDaoUtil {
    private static final boolean DUBUG = true;
    private DaoManager manager;
    private StudentDao studentDao;
    private DaoSession daoSession;

    public StudentDaoUtil(Context context) {
        manager = DaoManager.getInstance();
        manager.init(context);
        daoSession = manager.getDaoSession();
        manager.setDebug(DUBUG);
    }

    /**
     * 添加數據,如果有重復則覆蓋
     */
    public void insertStudent(Student student) {
        manager.getDaoSession().insertOrReplace(student);
    }

    /**
     * 添加多條數據,需要開辟新的線程
     */
    public void insertMultStudent(final List<Student> students) {
        manager.getDaoSession().runInTx(new Runnable() {
            @Override
            public void run() {
                for (Student student : students) {
                    manager.getDaoSession().insertOrReplace(student);
                }
            }
        });
    }


    /**
     * 刪除數據
     */
    public void deleteStudent(Student student) {
        manager.getDaoSession().delete(student);
    }

    /**
     * 刪除全部數據
     */
    public void deleteAll(Class cls) {
        manager.getDaoSession().deleteAll(cls);
    }

    /**
     * 更新數據
     */
    public void updateStudent(Student student) {
        manager.getDaoSession().update(student);
    }

    /**
     * 按照主鍵返回單條數據
     */
    public Student listOneStudent(long key) {
        return manager.getDaoSession().load(Student.class, key);
    }

    /**
     * 根據指定條件查詢數據
     */
    public List<Student> queryStudent() {
        //查詢構建器
        QueryBuilder<Student> builder = manager.getDaoSession().queryBuilder(Student.class);
        List<Student> list = builder.where(StudentDao.Properties.Sex.ge(1)).where(StudentDao.Properties.Name.like("王小二")).list();
        return list;
    }

    /**
     * 查詢全部數據
     */
    public List<Student> queryAll() {
        return manager.getDaoSession().loadAll(Student.class);
    }
}

效果很明顯,GreenDao的封裝更加短小精悍,語義明朗,下面對GreenDao中Dao對象其他API的介紹

查詢附加單個條件
.where()
.whereOr()
查詢附加多個條件
.where(, , ,)
.whereOr(, , ,)
查詢附加排序
.orderDesc()
.orderAsc()
查詢限制當頁個數
.limit()
查詢總個數
.count()

結語

關于GreenDao的的基本概念與基本操作就講到這里,更多對于GreenDao的數據庫操作還需要多多從實戰中去探索,這里只是一個快速入門的引導.GreenDao高級操作還包括有:多表查詢、多表關聯、session緩存等用法,可以到GreenDao的官網進行學習

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容

  • 九月風光何處好?聽著鳥唱山溝找。 白云落上我衣襟,九曲通幽山澗道。
    琴詩音閱讀 380評論 2 14
  • 愛書的人一定都不會回避談書店,一座城市少不了書店,書店往往是一座城市的地標,可是現在亞馬遜、當當、京東已經把實體書...
    雨落圓荷閱讀 135評論 1 1
  • 楊俊嶺閱讀 326評論 0 0
  • 起初不經意的你和少年不經事的我 紅塵中的情緣只因那生命匆匆不語的膠著 想是人世間的錯或前世流傳的因果 終生的所有也...
    柳夢梅閱讀 244評論 0 0