Android Study 之 玩轉(zhuǎn)GreenDao 3.2.2 點(diǎn)滴提升逼格~

<font color=#FF0000>LZ-Says:擼文不易渔扎,且行且珍惜~

每日一笑:

   假如生活欺騙了你,找50個(gè)程序員問問為什么編程信轿;
   假如生活讓你想死晃痴,找50個(gè)程序員問問Bug改完了沒有残吩;
   假如你覺得生活拮據(jù),找50個(gè)程序員問問工資漲了沒有倘核;
   假如你覺得活著無聊泣侮,找50個(gè)程序員問問他們一天都干了什么! 

<center>
這里寫圖片描述

</center>

前言

端午三天紧唱,去天津玩了一圈旁瘫,出去走走,放松放松琼蚯,感覺也不錯(cuò)酬凳。來點(diǎn)正能量,今天遭庶,讓我們一塊研究研究如何使用GreenDao 3.2.2宁仔,從而逐步增強(qiáng)我們的逼格。

來來來峦睡,一塊浪起來~

Android開發(fā)過程中翎苫,有時(shí)候我們需要使用SQLite數(shù)據(jù)庫去本地存儲(chǔ)一些臨時(shí)數(shù)據(jù),之前榨了,我們通過繼承SQLiteOpenHelper實(shí)現(xiàn)創(chuàng)建數(shù)據(jù)庫煎谍,基本表以及迭代開發(fā)中數(shù)據(jù)庫 數(shù)據(jù) 內(nèi)容 字段 變更時(shí)處理,簡單了解可以查看LZ之前總結(jié)的一些對(duì)SQLite常用知識(shí)龙屉,地址如下:

http://blog.csdn.net/u012400885/article/details/69218833

而今天為大家介紹的GreenDao 3.2.2呐粘,便是與咱上面說的數(shù)據(jù)庫有關(guān)系,接著往下瞧~

首先為大家展示下本篇運(yùn)行結(jié)果:

<center>
這里寫圖片描述

<center>
這里寫圖片描述

GreenDao初識(shí)

有的小伙伴可能就會(huì)問了转捕,我用的SQLiteOpenHelper挺方便的作岖,干嘛要用這個(gè)呢?他有什么優(yōu)勢或者值得讓我去使用的亮點(diǎn)嗎五芝?

下面來聊聊有關(guān)GreenDao的獨(dú)特魅力~

官方資料地址

首先為大家附上官方地址痘儡,方便英文水準(zhǔn)好的直接查閱,如下:

GreenDao 官網(wǎng):http://greenrobot.org/greendao/

GreenDao 特征介紹:http://greenrobot.org/greendao/features/

GreenDao 學(xué)習(xí)文檔:http://greenrobot.org/greendao/documentation/

GreenDao 更新日志:http://greenrobot.org/greendao/changelog/

GreenDao GitHub地址:https://github.com/greenrobot/greenDAO

接下來為大家介紹有關(guān)GreenDao八大特性枢步,相當(dāng)666哦~

GreenDao 八大特性

  1. 對(duì)象/關(guān)系映射(ORM)[Object/relation mapping]

GreenDAO的本質(zhì)是為存儲(chǔ)在關(guān)系數(shù)據(jù)庫SQLite中的數(shù)據(jù)提供面向?qū)ο蟮慕缑妗?/strong>

<font color=#FF0000>使用過程中沉删,我們只需定義數(shù)據(jù)模型,而GreenDAO將創(chuàng)建Java數(shù)據(jù)對(duì)象(實(shí)體)和DAO(數(shù)據(jù)訪問對(duì)象)醉途,節(jié)省部分代碼~

  接下來給大家附上一張對(duì)象關(guān)系映射圖:

<center>
這里寫圖片描述

</center>

  1. 性能

關(guān)于這點(diǎn)矾瑰,引入官方的一句話:

GreenDAO does not make any compromises regarding performance. <font color=#FF0000>(GreenDAO對(duì)性能不做任何妥協(xié)) 666~

So 在目前所知道的ORM中,GreenDao是最快的结蟋,非常適合存儲(chǔ)大量數(shù)據(jù)脯倚。<font color=#FF0000>舉一個(gè)簡單的例子,使用了GreenDao,大多數(shù)實(shí)體可以以每秒幾千個(gè)實(shí)體的速率進(jìn)行插入推正,更新和加載恍涂。 是不是很6?

鑒于咱都是用事實(shí)說話的老百姓植榕,下面將官方測試圖例附上供大家觀看再沧。

<center>
這里寫圖片描述

</center>

腫么樣,是不是很666尊残?

三個(gè)字概括炒瘸,<font color=#FF0000>高性能~!G奚馈顷扩!

  1. 加密支持

GreenDao支持加密數(shù)據(jù)庫來保護(hù)敏感數(shù)據(jù),當(dāng)然你也可以和SQLCipher一塊配合使用慰毅。點(diǎn)我查看API文檔

  1. 微小的依賴庫

GreenDao關(guān)鍵依賴庫大小不超過100kb隘截,So,也不會(huì)出現(xiàn)因?yàn)橐隚reenDao而出現(xiàn)65k問題~<font color=#FF0000>(當(dāng)然汹胃,如果你的app快到臨界線了婶芭,這個(gè)LZ可就不敢保證了哦~</font>)

  1. 活動(dòng)實(shí)體

如果需要,實(shí)體可以被“激活”着饥。而活動(dòng)實(shí)體可以透明地解析關(guān)系(我們要做的只是調(diào)用getter即可)犀农,并且有更新、刪除和刷新方法宰掉,以便方便地訪問持久性功能

  1. 協(xié)議緩沖區(qū)支持

GreenDAO允許您將協(xié)議緩沖區(qū)(protobuf)對(duì)象直接保存到數(shù)據(jù)庫中呵哨。如果您通過protobuf通話到您的服務(wù)器,則不需要另一個(gè)映射贵扰。常規(guī)實(shí)體的所有持久性操作都可用于protobuf對(duì)象仇穗。So,相信這是GreenDAO的獨(dú)特之處戚绕。<font color=#FF0000>雖然LZ也不是很懂,相信玩轉(zhuǎn)之后枝冀,也會(huì)有自己的理解~

  1. 自動(dòng)生成代碼

使用GreenDao舞丛,我們無需關(guān)注實(shí)體類以及Dao,體貼的GreenDao已為我們自動(dòng)生成了是不是很贊9G蚯小!

  1. 開源

開源绒障,有興趣的同學(xué)可以查看源碼吨凑,深入了解機(jī)制,流程,當(dāng)然鸵钝,LZ目前只是停留在會(huì)用的層面即可糙臼。

同樣在GitHub,到現(xiàn)在還在維護(hù)恩商,貌似最近的一次是倆個(gè)月前了吧变逃,關(guān)注人還不少,版本也越來越完善怠堪,感謝那些背后默默付出的人~

PS:個(gè)人覺得開源有利有弊揽乱,就比如Android,開源使得Android越來越向成熟粟矿,完善之路走去凰棉,但是所帶來的弊端同樣不容忽視,各種廠商對(duì)應(yīng)的各種定制化Android陌粹,讓身為Android開發(fā)的不得不羨慕ios開發(fā)撒犀,哈哈,純屬LZ個(gè)人理解~

了解了以上內(nèi)容申屹,我們總結(jié)下使用GreenDao的優(yōu)勢绘证,如下。

GreenDao 優(yōu)勢

  1. 目前來說性能最高哗讥,內(nèi)存消耗最小嚷那,支持?jǐn)?shù)據(jù)庫加密;
  2. 依賴庫小于100kb杆煞,且使用人數(shù)眾多魏宽,維護(hù)者也一直在更新;
  3. 完善的api决乎,并且對(duì)Android進(jìn)行了高度優(yōu)化队询,個(gè)人覺得很不錯(cuò)~

GreenDao 對(duì)外提供核心類簡介

下面為大家附上一張圖,大家可以仔細(xì)查看后构诚,在仔細(xì)往下看蚌斩,有助于理解~

<center>
這里寫圖片描述

1.DaoMaster:

   使用GreenDao的切入點(diǎn)(開始)。
   DaoMaster保存數(shù)據(jù)庫對(duì)象(SQLiteDatabase)并管理特定模式的Dao類(而不是對(duì)象)范嘱。它具有靜態(tài)方法來創(chuàng)建表或?qū)⑺鼈儎h除送膳。其內(nèi)部類OpenHelper和DevOpenHelper是在SQLite數(shù)據(jù)庫中創(chuàng)建模式的SQLiteOpenHelper實(shí)現(xiàn)。

2.DaoSession:

  管理特定模式的所有可用Dao對(duì)象丑蛤,您可以使用其中一個(gè)getter方法獲取叠聋。DaoSession還為實(shí)體提供了一些通用的持久性方法,如插入受裹,加載碌补,更新,刷新和刪除。最后厦章,DaoSession對(duì)象也跟蹤一個(gè)身份范圍镇匀。有關(guān)更多詳細(xì)信息,[請(qǐng)點(diǎn)擊查看會(huì)話文檔](http://greenrobot.org/greendao/documentation/sessions/)闷袒。

3.Dao層:

  數(shù)據(jù)訪問對(duì)象(Dao)持續(xù)存在并查詢實(shí)體坑律。對(duì)于每個(gè)實(shí)體,GreenDao生成一個(gè)Dao囊骤,它比DaoSession有更多的持久化方法晃择,例如:count,loadAll和insertInTx也物。

4.實(shí)體:

   持久對(duì)象 通常實(shí)體是使用標(biāo)準(zhǔn)Java屬性(如POJO或JavaBean)來表示數(shù)據(jù)庫行的對(duì)象

鋪墊到這里宫屠,感覺也差不多了,開搞吧~

Hey , GreenDao , Let's continue our study~!!!

1. 配置Gradle

1.配置<font color=#FF0000>工程目錄下build.gradle

添加GreenDao插件支持滑蚯,要添加的內(nèi)容后面都已經(jīng)加上了簡單注釋

buildscript {
    repositories {
        jcenter()
        mavenCentral() // 添加遠(yuǎn)程倉庫地址
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.2'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // 添加插件 更好支持GreenDao
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

之后點(diǎn)擊右上角Sync Now 荤傲,AS會(huì)自動(dòng)下載插件武花,等待就好~!如下圖所示:

這里寫圖片描述

2.配置<font color=#FF0000>項(xiàng)目下的build.gradle

  • 添加應(yīng)用插件依賴;

apply plugin: 'org.greenrobot.greendao' // 添加應(yīng)用依賴插件

  • 添加庫文件

compile 'org.greenrobot:greendao:3.2.2' // 添加庫

  • 初始化GreenDao配置

按照官方的說法牙捉,我們無需任何其他配置掰曾,但是署海,數(shù)據(jù)庫版本這個(gè)你得考慮下吧氛琢,當(dāng)然,如果也不想考慮疤剑,那就使用默認(rèn)的(默認(rèn)版本為1)滑绒。

// 配置GreenDao基本參數(shù)
greendao {
schemaVersion 1 //當(dāng)前數(shù)據(jù)庫版本
}

下面具體為大家介紹下配置中可用參數(shù)作用<font color=#FF0000>(PS:大家可選擇性添加):

1. schemaVersion:當(dāng)前版本的數(shù)據(jù)庫模式。這被OpenHelpers類用于在模式版本之間遷移隘膘。如果更改了實(shí)體/數(shù)據(jù)庫模式疑故,則必須增加該值。默認(rèn)為1弯菊。

2. daoPackage:生成的Dao纵势,DaoMaster和DaoSession的包名稱。 默認(rèn)為源實(shí)體的包名稱管钳。

3. targetGenDir:生成源應(yīng)存儲(chǔ)在的位置吨悍。 默認(rèn)為構(gòu)建目錄( build / generated / source / greendao)中生成的源文件夾。

4. generateTests: 設(shè)置為true以自動(dòng)生成單元測試蹋嵌。

5. targetGenDirTests: 應(yīng)存儲(chǔ)生成的單元測試的基本目錄。默認(rèn)為 src / androidTest / java葫隙。

這一步配置完結(jié)果如下栽烂,省略部分內(nèi)容:

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // 添加應(yīng)用依賴插件

android {
    // 省略部分內(nèi)容...
}

// 配置GreenDao基本參數(shù)
greendao {
    schemaVersion 1 //當(dāng)前數(shù)據(jù)庫版本
}

dependencies {
    // 省略部分內(nèi)容...
    compile 'org.greenrobot:greendao:3.2.2' // 添加庫
}

到這里,GreenDao基本配置也就告一段落了`

而使用GreenDao前期準(zhǔn)備工作也告一段落了,那么接下來讓我們實(shí)際去感受下GreenDao的魅力吧~

2. 了解如何編寫GreenDao所需要的實(shí)體類

在前面一部分我們?cè)?jīng)說過腺办,我們只需要去關(guān)注實(shí)體類即可焰手,那么這個(gè)實(shí)體類和普通實(shí)體類又有什么區(qū)別?我們?cè)撛趺慈?shí)現(xiàn)我們的實(shí)體類呢怀喉?別急书妻,繼續(xù)往下瞅~

我們先看一下官方為我們提供的小例子,通過講解這個(gè)小例子躬拢,讓我們充分了解關(guān)于使用GreenDao一些方式方法躲履,從而更好的去get這一技能~

@Entity
public class User {
    @Id
    private Long id;
 
    private String name;
 
    @Transient
    private int tempUsageCount; // not persisted
 
   // getters and setters for id and user ...
}

首先定義了一個(gè)User對(duì)象,這個(gè)對(duì)象包含三個(gè)屬性聊闯,分別為id工猜,name以及tempUsageCount。乍眼一看菱蔬,沒啥區(qū)別嘛篷帅,可大家注意到了@Entity@Id以及@Transient這倆個(gè)東西了嗎拴泌?這是啥魏身?我們一塊具體瞅瞅

  • <font color=#FF0000>@Entity注解

    @Entity注解標(biāo)記了一個(gè)Java類作為greenDAO一個(gè)presistable實(shí)體。簡單理解為蚪腐,他告訴GreenDao箭昵,要根據(jù)這個(gè)實(shí)體類去生成相應(yīng)的Dao,方便我們?nèi)ゲ僮飨髯拢瑯右蚕喈?dāng)于將我們的實(shí)體類和表做了關(guān)聯(lián)宙枷,當(dāng)然這些東西是人GreenDao去搞定的,了解了解總是有好處的嘛`

同樣我們也可以使用@Entity配置一些詳細(xì)信息茧跋,如下:

@Entity(
        // 如果你有一個(gè)以上的模式慰丛,你可以告訴greendao實(shí)體屬于哪個(gè)模式(選擇任何字符串作為名稱)。
        schema = "myschema",
        
        // 標(biāo)志允許實(shí)體類可有更新瘾杭,刪除诅病,刷新方法
        active = true,
        
        // 指定數(shù)據(jù)庫中表的名稱。默認(rèn)情況下粥烁,該名稱基于實(shí)體類名贤笆。
        nameInDb = "AWESOME_USERS",
        
        // 在這里定義多個(gè)列的索引
        indexes = {
                @Index(value = "name DESC", unique = true)
        },
        
        // 如果DAO創(chuàng)建數(shù)據(jù)庫表(默認(rèn)為true),則設(shè)置標(biāo)記去標(biāo)識(shí)讨阻。如果有多個(gè)實(shí)體映射到一個(gè)表芥永,或者在greenDAO之外創(chuàng)建表創(chuàng)建,將此設(shè)置為false钝吮。
        createInDb = false,
 
        // 是否應(yīng)該生成所有的屬性構(gòu)造函數(shù)埋涧。一個(gè)無args構(gòu)造函數(shù)總是需要的
        generateConstructors = true,
 
        // 是否生成屬性的getter和setter
        generateGettersSetters = true
)
  • <font color=#FF0000>@Id注解

    選擇long / Long屬性作為實(shí)體ID板辽。在數(shù)據(jù)庫方面,它是主要的關(guān)鍵參數(shù)autoincrement  是使ID值不斷增加的標(biāo)志(不重復(fù)使用舊值)棘催,也就是咱常說的**自增長**劲弦。
    
  • <font color=#FF0000>@Property

    允許您定義屬性映射到的非默認(rèn)列名稱。如果缺少醇坝,greenDAO將以SQL-ish方式使用字段名稱(大寫字母邑跪,下劃線而不是駝峰命名法,例如 customName將成為 CUSTOM_NAME)呼猪。注意:當(dāng)前只能使用內(nèi)聯(lián)常量來指定列名画畅。
    
  • <font color=#FF0000>@NotNull

    該屬性在數(shù)據(jù)庫端成為“NOT NULL”列。通常使用@NotNull標(biāo)記原始類型(long郑叠,int夜赵,short,byte)是有意義的乡革,而具有包裝類(Long寇僧,Integer,Short沸版,Byte))的可空值嘁傀。

  • <font color=#FF0000>@Transient

    標(biāo)記要從持久性排除的屬性,使用這些臨時(shí)狀態(tài)等视粮∠赴欤或者,也可以使用來自Java 的transient關(guān)鍵字蕾殴。
    

下面為大家拓展倆個(gè)注解笑撞,有用到的可以參考下:

  • <font color=#FF0000>@Index

    為相應(yīng)的數(shù)據(jù)庫列創(chuàng)建數(shù)據(jù)庫索引
    名稱:如果不喜歡greenDAO為索引生成的默認(rèn)名稱,則可以在此處指定钓觉。
    唯一:向索引添加UNIQUE約束茴肥,強(qiáng)制所有值都是唯一的。
    

下面有個(gè)小例子荡灾,供大家查閱(官網(wǎng)直接拷貝瓤狐,哈哈~):

@Entity
public class User {
    @Id private Long id;
    @Index(unique = true)
    private String name;
}
  • <font color=#FF0000>@Unique

    向數(shù)據(jù)庫列添加了一個(gè)UNIQUE約束。請(qǐng)注意批幌,SQLite還會(huì)隱式地為其創(chuàng)建索引础锐。例子如下:
    
@Entity
public class User {
    @Id private Long id;
    @Unique private String name;
}

大概的翻譯了官方的內(nèi)容,LZ英文不是很好荧缘,雖然靠著翻譯后的網(wǎng)頁進(jìn)行閱讀皆警,可有些翻譯的還不太通順,所以部分按照自己的理解寫了截粗,大家諒解~

嗯耀怜,到現(xiàn)在恢着,了解了一部分內(nèi)容,我們開始編碼Go Go Go ~2破啤!从诲!

Coding大刀闊斧的干吧

Hello左痢,我們的第一個(gè)實(shí)體類~

我們先設(shè)定一個(gè)簡單場景,方便我們下面代碼演示系洛,如下:

定義一個(gè)Student類俊性,其中分別有如下幾個(gè)屬性:

  1. 學(xué)員id;
  2. 學(xué)員編號(hào)描扯;
  3. 學(xué)員姓名定页;
  4. 學(xué)員性別;
  5. 學(xué)員成績绽诚。

接下來我們將要根據(jù)以上屬性進(jìn)行GreenDao學(xué)習(xí)~

Hi 典徊,GreenDao 實(shí)體類實(shí)現(xiàn)

package cn.hlq.greendaostudy.entity;

import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Index;

/**
 * Created by HLQ on 2017/6/5
 */
@Entity
public class Student {

    @Id(autoincrement = true) // id自增長
    private Long stuId; // 學(xué)院id

    @Index(unique = true) // 唯一性
    private String stuNo; // 學(xué)員編號(hào)

    private String stuName; // 學(xué)員姓名

    private String stuSex; // 學(xué)員性別

    private String stuScore; // 學(xué)員成績

}

編譯項(xiàng)目,生成Dao相關(guān)文件~

<center>
這里寫圖片描述

編輯之后恩够,我們會(huì)發(fā)現(xiàn)我們的實(shí)體類多了一些東西卒落,這里貼出來大家看下:

package cn.hlq.greendaostudy.entity;

import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Index;
import org.greenrobot.greendao.annotation.Generated;

/**
 * Created by HLQ on 2017/6/5
 */
@Entity
public class Student {

    @Id(autoincrement = true) // id自增長
    private Long stuId; // 學(xué)院id

    @Index(unique = true) // 唯一性
    private String stuNo; // 學(xué)員編號(hào)

    private String stuName; // 學(xué)員姓名

    private String stuSex; // 學(xué)員性別

    private String stuScore; // 學(xué)員成績

    @Generated(hash = 315497705)
    public Student(Long stuId, String stuNo, String stuName, String stuSex,
            String stuScore) {
        this.stuId = stuId;
        this.stuNo = stuNo;
        this.stuName = stuName;
        this.stuSex = stuSex;
        this.stuScore = stuScore;
    }

    @Generated(hash = 1556870573)
    public Student() {
    }

    public Long getStuId() {
        return this.stuId;
    }

    public void setStuId(Long stuId) {
        this.stuId = stuId;
    }

    public String getStuNo() {
        return this.stuNo;
    }

    public void setStuNo(String stuNo) {
        this.stuNo = stuNo;
    }

    public String getStuName() {
        return this.stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public String getStuSex() {
        return this.stuSex;
    }

    public void setStuSex(String stuSex) {
        this.stuSex = stuSex;
    }

    public String getStuScore() {
        return this.stuScore;
    }

    public void setStuScore(String stuScore) {
        this.stuScore = stuScore;
    }

}

這里再次闡述下,如下:

   <font color=#FF0000>1. 編譯后自動(dòng)生成無參蜂桶,有參構(gòu)造儡毕;

   <font color=#FF0000>2. 編譯后自動(dòng)生成getter,setter扑媚;

因?yàn)樵壑皼]有指定生成Dao內(nèi)容存儲(chǔ)的位置腰湾,但是GreenDao有默認(rèn)地址哦所以,我們?nèi)ツJ(rèn)地址查看即可

<center>
這里寫圖片描述

GreenDao中邏輯運(yùn)算符

<center>
這里寫圖片描述

這里從源碼中找了一段疆股,很清楚费坊,大家簡單看一下即可~

擼碼實(shí)現(xiàn)~

獲取StudentDao

也就是初始化Dao,如下:

    /**
     * 獲取StudentDao
     */
    private void getStuDao() {
        // 創(chuàng)建數(shù)據(jù)
        DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(self, "hlq.db", null);
        daoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());
        daoSession = daoMaster.newSession();
        stuDao = daoSession.getStudentDao();
    }

新增一條數(shù)據(jù)

        // 新增一條數(shù)據(jù)
        findViewById(R.id.id_insert).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Student stu = new Student(null, "001", "賀da寶", "男孩", "50");
                long end = stuDao.insert(stu);
                String msg = "";
                if (end > 0) {
                    msg = "001新增成功~";
                } else {
                    msg = "新增失敗~";
                }
                stuDao.insert(new Student(null, "002", "賀er寶", "男人", "66"));
                stuDao.insert(new Student(null, "003", "賀san寶", "爺兒們", "23"));
                stuDao.insert(new Student(null, "004", "賀si寶", "男人", "65"));
                Toast.makeText(self, "001 002 003 004新增成功~", Toast.LENGTH_SHORT).show();
            }
        });

新增List集合數(shù)據(jù)

        // 新增List集合數(shù)據(jù)
        findViewById(R.id.id_insert_list).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                List<Student> stuList = new ArrayList<Student>();
                stuList.add(new Student(null, "005", "賀利權(quán)", "小爺兒們", "43"));
                stuList.add(new Student(null, "006", "賀利權(quán)", "大爺兒們", "35"));
                stuList.add(new Student(null, "007", "賀利權(quán)", "老爺兒們", "99"));
                stuList.add(new Student(null, "008", "賀利權(quán)", "老少爺兒們", "88"));
                stuDao.insertInTx(stuList);
                Toast.makeText(self, "新增成功~", Toast.LENGTH_SHORT).show();
            }
        });

查詢所有

        findViewById(R.id.id_search_all).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                List<Student> stuList = stuDao.queryBuilder().list();
                if (stuList != null) {
                    String searchAllInfo = "";
                    for (int i = 0; i < stuList.size(); i++) {
                        Student stu = stuList.get(i);
                        searchAllInfo += "id:" + stu.getStuId() + "編號(hào):" + stu.getStuNo() + "姓名:" + stu.getStuName() + "性別:" + stu.getStuSex() + "成績:" + stu.getStuScore() + "\n";
                    }
                    TextView tvSearchInfo = (TextView) findViewById(R.id.id_search_all_info);
                    tvSearchInfo.setText(searchAllInfo);
                }
            }
        });

查詢指定數(shù)據(jù) 查詢姓名為"賀da寶"的信息

        // 查詢指定數(shù)據(jù) 查詢姓名為"賀da寶"的信息
        findViewById(R.id.id_search_assign).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String searchAssignInfo = "";
                List<Student> stuList = stuDao.queryBuilder().where(StudentDao.Properties.StuName.eq("賀da寶")).list();
                for (int i = 0; i < stuList.size(); i++) {
                    Student stu = stuList.get(i);
                    searchAssignInfo += "id:" + stu.getStuId() + "編號(hào):" + stu.getStuNo() + "姓名:" + stu.getStuName() + "性別:" + stu.getStuSex() + "成績:" + stu.getStuScore() + "\n";
                }
                TextView tvSearchAssign = (TextView) findViewById(R.id.id_search_assign_info);
                tvSearchAssign.setText(searchAssignInfo);
            }
        });

查詢指定數(shù)據(jù) 查詢姓名為"賀da寶"的信息并按照成績排序-降序

        // 查詢指定數(shù)據(jù) 查詢姓名為"賀da寶"的信息并按照成績排序-降序
        findViewById(R.id.id_search_assign_order_desc).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String searchAssignOrderDesc = "";
                List<Student> stuList = stuDao.queryBuilder().where(StudentDao.Properties.StuName.eq("賀利權(quán)")).orderDesc(StudentDao.Properties.StuScore).list();
                for (int i = 0; i < stuList.size(); i++) {
                    Student stu = stuList.get(i);
                    searchAssignOrderDesc += "id:" + stu.getStuId() + "編號(hào):" + stu.getStuNo() + "姓名:" + stu.getStuName() + "性別:" + stu.getStuSex() + "成績:" + stu.getStuScore();
                }
                TextView tvSearchOrderDesc = (TextView) findViewById(R.id.id_search_assign_order_desc_info);
                tvSearchOrderDesc.setText(searchAssignOrderDesc);
            }
        });

查詢指定數(shù)據(jù) 查詢姓名為"賀da寶"的信息并按照成績排序-升序

        // 查詢指定數(shù)據(jù) 查詢姓名為"賀da寶"的信息并按照成績排序-升序
        findViewById(R.id.id_search_assign_order_asc).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String searchAssignOrderDesc = "";
                List<Student> stuList = stuDao.queryBuilder().where(StudentDao.Properties.StuName.eq("賀利權(quán)")).orderAsc(StudentDao.Properties.StuScore).list();
                for (int i = 0; i < stuList.size(); i++) {
                    Student stu = stuList.get(i);
                    searchAssignOrderDesc += "id:" + stu.getStuId() + "編號(hào):" + stu.getStuNo() + "姓名:" + stu.getStuName() + "性別:" + stu.getStuSex() + "成績:" + stu.getStuScore();
                }
                TextView tvSearchOrderDesc = (TextView) findViewById(R.id.id_search_assign_order_asc_info);
                tvSearchOrderDesc.setText(searchAssignOrderDesc);
            }
        });

組合查詢數(shù)據(jù) 查詢姓名為"賀利權(quán)" 并且成績小于等于60

        // 組合查詢數(shù)據(jù) 查詢姓名為"賀利權(quán)" 并且成績小于等于60
        findViewById(R.id.id_search_combination).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String searchAssignOrderDesc = "";
                QueryBuilder<Student> stuQB = stuDao.queryBuilder();
                stuQB.where(StudentDao.Properties.StuName.eq("賀利權(quán)"), StudentDao.Properties.StuScore.le("60"));
                List<Student> stuList = stuQB.list();
                for (int i = 0; i < stuList.size(); i++) {
                    Student stu = stuList.get(i);
                    searchAssignOrderDesc += "id:" + stu.getStuId() + "編號(hào):" + stu.getStuNo() + "姓名:" + stu.getStuName() + "性別:" + stu.getStuSex() + "成績:" + stu.getStuScore() + "\n";
                }
                TextView tvSearchOrderDesc = (TextView) findViewById(R.id.id_search_combination_info);
                tvSearchOrderDesc.setText(searchAssignOrderDesc);
            }
        });

查詢所有返回?cái)?shù)據(jù) 但只返回前三條數(shù)據(jù)

        // 查詢所有返回?cái)?shù)據(jù) 但只返回前三條數(shù)據(jù)
        findViewById(R.id.id_search_limit).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                List<Student> stuList = stuDao.queryBuilder().limit(3).list();
                if (stuList != null) {
                    String searchAllInfo = "";
                    for (int i = 0; i < stuList.size(); i++) {
                        Student stu = stuList.get(i);
                        searchAllInfo += "id:" + stu.getStuId() + "編號(hào):" + stu.getStuNo() + "姓名:" + stu.getStuName() + "性別:" + stu.getStuSex() + "成績:" + stu.getStuScore() + "\n";
                    }
                    TextView tvSearchInfo = (TextView) findViewById(R.id.id_search_limit_info);
                    tvSearchInfo.setText(searchAllInfo);
                }
            }
        });

查詢所有返回?cái)?shù)據(jù) 但只返回前三條數(shù)據(jù) 并且跳過第一條數(shù)據(jù)

        // 查詢所有返回?cái)?shù)據(jù) 但只返回前三條數(shù)據(jù) 并且跳過第一條數(shù)據(jù)
        findViewById(R.id.id_search_limit_offset).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                List<Student> stuList = stuDao.queryBuilder().limit(3).offset(1).list();
                if (stuList != null) {
                    String searchAllInfo = "";
                    for (int i = 0; i < stuList.size(); i++) {
                        Student stu = stuList.get(i);
                        searchAllInfo += "id:" + stu.getStuId() + "編號(hào):" + stu.getStuNo() + "姓名:" + stu.getStuName() + "性別:" + stu.getStuSex() + "成績:" + stu.getStuScore() + "\n";
                    }
                    TextView tvSearchInfo = (TextView) findViewById(R.id.id_search_limit_offset_info);
                    tvSearchInfo.setText(searchAllInfo);
                }
            }
        });

查詢所有信息總條數(shù)

        // 查詢所有信息總條數(shù)
        findViewById(R.id.id_search_count).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int stuSumCount = stuDao.queryBuilder().list().size();
                TextView tvSearchInfo = (TextView) findViewById(R.id.id_search_count_info);
                tvSearchInfo.setText(stuSumCount + "");
            }
        });

刪除指定信息

        // 刪除指定信息
        findViewById(R.id.id_delete).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stuDao.queryBuilder().where(StudentDao.Properties.StuName.eq("賀si寶")).buildDelete().executeDeleteWithoutDetachingEntities();
                Toast.makeText(self, "刪除成功~", Toast.LENGTH_SHORT).show();
//                stuDao.delete(new Student()); // 刪除指定對(duì)象
//                stuDao.deleteAll(); // 刪除所有
            }
        });

更新指定信息

        // 更新指定信息
        findViewById(R.id.id_update).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Student student = stuDao.queryBuilder().where(StudentDao.Properties.StuName.eq("賀da寶")).build().unique();
                if (student != null) {
                    student.setStuName("I Love You");
                    stuDao.update(student);
                }
                Toast.makeText(self, "更新成功~", Toast.LENGTH_SHORT).show();
            }
        });

結(jié)束語以及源碼查看地址

GitHub地址

https://github.com/HLQ-Struggle/GreenDaoStudy

作為初學(xué)者押桃,希望這邊文章對(duì)大家有所幫助葵萎,歡迎大家指正~

Thanks~

如果覺得寫的不錯(cuò),歡迎大家贊助LZ抽根煙Thanks

hlq-money.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末唱凯,一起剝皮案震驚了整個(gè)濱河市羡忘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌磕昼,老刑警劉巖卷雕,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異票从,居然都是意外死亡漫雕,警方通過查閱死者的電腦和手機(jī)滨嘱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浸间,“玉大人太雨,你說我怎么就攤上這事】猓” “怎么了囊扳?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長兜看。 經(jīng)常有香客問我锥咸,道長,這世上最難降的妖魔是什么细移? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任搏予,我火速辦了婚禮,結(jié)果婚禮上弧轧,老公的妹妹穿的比我還像新娘雪侥。我一直安慰自己,他們只是感情好劣针,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布校镐。 她就那樣靜靜地躺著,像睡著了一般捺典。 火紅的嫁衣襯著肌膚如雪鸟廓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天襟己,我揣著相機(jī)與錄音引谜,去河邊找鬼。 笑死擎浴,一個(gè)胖子當(dāng)著我的面吹牛员咽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贮预,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼贝室,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仿吞?” 一聲冷哼從身側(cè)響起滑频,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唤冈,沒想到半個(gè)月后峡迷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年绘搞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彤避。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夯辖,死狀恐怖琉预,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情楼雹,我是刑警寧澤模孩,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站贮缅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏介却。R本人自食惡果不足惜谴供,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望齿坷。 院中可真熱鬧桂肌,春花似錦、人聲如沸永淌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遂蛀。三九已至谭跨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間李滴,已是汗流浹背螃宙。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留所坯,地道東北人谆扎。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像芹助,于是被迫代替她去往敵國和親堂湖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • greenDAO官方主頁:http://greendao-orm.com/ 官方主頁新地址:http://gree...
    sunny_zhang閱讀 10,120評(píng)論 12 49
  • 前段時(shí)間工作中接觸到了數(shù)據(jù)庫greendao状土,將項(xiàng)目中所有原生sqlite替換成為了greendao數(shù)據(jù)庫封裝框架...
    ya_nn閱讀 14,912評(píng)論 6 33
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,501評(píng)論 25 707
  • 一无蜂、關(guān)于greenDAO greenDAO應(yīng)該算是當(dāng)前最火的數(shù)據(jù)庫開源框架了,它是一個(gè)將對(duì)象映射到SQLite數(shù)據(jù)...
    當(dāng)幸福來敲門58閱讀 13,845評(píng)論 3 19
  • 我想有這樣一個(gè)人, 我和她的身份沒有太大差距彼乌, 我可以和她結(jié)婚泻肯,生子渊迁,過一輩子。 他的父母灶挟,我的父母琉朽,對(duì)我們沒有一...
    玖醬G菌閱讀 253評(píng)論 0 0