王黎聰-GreenDAO 3筆記-1

序言

(寫分享前的序言)
大家好.很高興能為大家分享Android之GreenDao筆記,也希望能和大家一起學習進步.
? ? ? ? 之前用過ormlite android,現(xiàn)在覺得GreenDAO 3.x特別好用,在網(wǎng)上搜索有關(guān)GreenDAO的文章都很不錯,在大量瀏覽優(yōu)秀文章后加上自己使用的總結(jié),寫下一份比較詳細的GreenDAO的筆記和大家分享一下

(寫分享中的序言)
寫到一半的時候覺得有點寫不下去了,幾度寫寫停停,心里動搖不堅定.有時候就會覺得那些寫原創(chuàng)技術(shù)博客的大牛好厲害,有很強的毅力,有時候覺得我是不是不適合寫博客.總之還是非常感謝那些無私奉獻技術(shù)的大牛們



簡介

現(xiàn)在GreenDao已經(jīng)成為Android數(shù)據(jù)庫高活躍的最佳選擇.最近寫在一個項目,做的本地緩存比較多,使用了GreenDao.

GreenDao3.X是采用注解的方式來定義實體類,通過gradle插件編譯方式生成Java數(shù)據(jù)對象和DAO對象。

GreenDAO是一個輕量級且快速的ORM框架(ORM>>>對象關(guān)系映射 英語:ObjectRelationMapping,簡稱ORM,或O/RM,或O/Rmapping,是一種程序技術(shù),用于實現(xiàn)面向?qū)ο缶幊陶Z言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換),專門為Android高度優(yōu)化和定制,它能夠支持每秒數(shù)千條記錄的CRUD操作,

GreenDAO優(yōu)勢:
? ? 號稱是Android 最快的關(guān)系型數(shù)據(jù)庫.
? ? 1.一個精簡的庫
? ? 2.性能最大化
? ? 3.內(nèi)存開銷最小化
? ? 4.編譯時間段,也就是運行操作時間短。
? ? 5.方便簡單的操作方式。(API)
? ? 6.還可以支持加密操作。
? ? 7.能夠讓代碼更加簡潔。
? ? 8.效率很高,插入和更新的速度是sqlite的2倍,加載實體的速度是ormlite的4.5倍。
? ? 9.文件較小,占用更少的內(nèi)存,但是需要create Dao,
? ? 10.操作實體靈活:支持get,update,delete等操作
? ? 11.對Android進行高度優(yōu)化
? ? 12.現(xiàn)GreenDao 3.X已集成RxJava(其最大的特點就是在增刪改查等基本操作時返回Observable,用于RxJava的流式邏輯寫法,其最大的優(yōu)點便于流式開發(fā),提高代碼的可讀性)

總之兩個字 好用


目錄

Android studio配置使用方法
創(chuàng)建實體(創(chuàng)建表)
封裝DatabaseManage
封裝調(diào)用入口(使用方便)
關(guān)系的映射
實體自帶的操作(方法)
普通的增刪改查
異步增刪改查
合并事務
數(shù)據(jù)庫升級,遷移
RxJava
數(shù)據(jù)加密


Android studio配置使用方法

1.工作空間的gradle文件配置(必填1/2)

//GreenDAO插件到構(gòu)建文件中將會自動創(chuàng)建一系列構(gòu)建任務(必填)
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'

2.App的gradle文件配置(必填2/2)

//在dependencies節(jié)點下加入(必填1/2)
compile 'org.greenrobot:greendao:3.2.0'
//在gradle文件中加入:(必填2/2)
apply plugin: 'org.greenrobot.greendao'

//數(shù)據(jù)庫加密時添加配置(非必填)
(compile 'net.zetetic:android-database-sqlcipher:3.5.1')
//使用數(shù)據(jù)庫升級輔助GreenDaoUpgradeHelper時添加配置(非必填)
(compile 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v1.2.0')

3.自定義路徑以及 相關(guān)配置(無需求,建議不添加)

//在App的gradle文件可以選擇添加(無需求建議不添加)
greendao{
//數(shù)據(jù)庫schema版本,也可以理解為數(shù)據(jù)庫版本號
schemaVersion 1

//設(shè)置DaoMaster、DaoSession、Dao包名
daoPackage'***.***.***'

//設(shè)置DaoMaster、DaoSession、Dao目錄
targetGenDir 'src/main/java'

//設(shè)置生成單元測試目錄
targetGenDirTest

//設(shè)置自動生成單元測試用例
generateTests
}

在gradle的根模塊中加入上述(必填)代碼,就完成了我們的基本配置了。

如果 需要數(shù)據(jù)庫版本升級? 將schemaVersion 1 改成? 2 就會觸發(fā)onUpgrade(SQLiteDatabase? sqLiteDatabase,int? oldVersion,int? newVersion)方法;


創(chuàng)建一個學生實體類(學生表)-----------(注意細節(jié)和詳細參考)

//實體屬性的注釋有很多種, 詳細參考 注
@Entity(active=true,nameInDb="StudentEntity")
public class StudentEntity {

//傳入 null? id會默認自增 (注意需要自增的話 id 的類型 一定要是大寫Long 類型),參考屬性字段注解
@Id(autoincrement =true)//默認就是true ,false代表不自增
Long id;

@Property( nameInDb ="name")
String name;

@Property( nameInDb ="age")
int age;

@Property ( nameInDb ="sex")
String sex;
}

特細節(jié):
? ? ? ?首先創(chuàng)建一個實體類,加上 @Entity? 代表創(chuàng)建一張表,類的屬性就是表的字段;
(創(chuàng)建實體類后需要 點擊Build->Make project (Ctrl+F9),就會生成 DaoMaster注,DaoSession注和實體類的數(shù)據(jù)訪問對象Dao注)

注實體類和屬性的注釋:
? ? -->@Entity實體類的注解參數(shù)
? schema ="myschema", ? ? //如果該實體屬于多個表單,可以使用該參數(shù);
? active =true, ? ? // 該實體屬于激活狀態(tài),激活狀態(tài)的實體有更新,刪除,刷新方法;
? nameInDb ="name", ? ?// 給這個表指定一個名字,默認情況下是名字是類名
? indexes = {@Index(value ="name DESC", unique =true) }, ? ?// 可以給多個屬性定義索引和其他屬性.
? createInDb =false, ? ?//是否使用GreenDao創(chuàng)建該表.
? generateConstructors =true, ? ?// 是否所有的屬性構(gòu)造器都應該被生成,無參構(gòu)造器總是被要求
? generateGettersSetters =true, ? ?// 如果該類中沒有set get方法是否自動生成

-->實體屬性的注解及參數(shù)
@Id? ? //一般會選擇long/Long屬性作為Entity ID(即數(shù)據(jù)庫中的主鍵)autoincrement=true表示主鍵會自增如果false就會使用舊值
@Property? ? //可以自定義一個該屬性在數(shù)據(jù)庫中的名稱,默認情況下數(shù)據(jù)庫中該屬性名稱是Bean對象中的 屬性名但是不是以駝峰式而是以大寫與下劃線組合形式來命名的比如:customName將命名為 CUSTOM_NAME;注意:外鍵不能使用該屬性;
@NotNull? ? //確保屬性值不會為null值;
@Transient? ? //使用該注釋的屬性不會被存入數(shù)據(jù)庫中;
@Unique ? ? //唯一約束
@ToMany ? ? //一對多
@OrderBy ? ? //排序
@ToOne ? ? ?//一對一
@generated ?//由greendao產(chǎn)生的構(gòu)造函數(shù)或方法



封裝DatabaseManage

1.創(chuàng)建MyDatabaseOpenHelp類繼承 DaoMaster.OpenHelper (創(chuàng)建實體類后需要 點擊Build->Make project (Ctrl+F9),就會生成 DaoMaster)(創(chuàng)建數(shù)據(jù)庫和更新數(shù)據(jù)庫的類)

public? class ?MyDatabaseOpenHelper? extends? DaoMaster.OpenHelper{

private? static? final? StringDB_NAME = "MainApp.db" ;
? ?public? MyDatabaseOpenHelper (Context? context,SQLiteDatabase.CursorFactory? factory){
? ?super(context,DB_NAME,factory);
}

@Override
public? void? onUpgrade(SQLiteDatabase? sqLiteDatabase,int? oldVersion,int? newVersion){
//數(shù)據(jù)庫升級使用,需要在gradle配置compile 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v1.2.0'
? //? MigrationHelper.getInstance().migrate(db,TestDataDao.class,TestData2Dao.class,TestData3Dao.class);
}
}


一個數(shù)據(jù)庫對應一個OpenHelp類.

2.創(chuàng)建DBManager (單利模式,創(chuàng)建helper 需要上下文,本章采取是寫一個靜態(tài)的Application實例)

public class DBManager {

//單例模式
private static DBManager dbManager;

/**
*創(chuàng)建MyDatabaseOpenHelper
*使用的上下文,
*可以 靜態(tài)一個Application實例(比較靈活) (采取的方案)
*也可以 寫一個初始方法 在Application中調(diào)用()
*也可以 在調(diào)用的時候傳入 上下文
*/

private MyDatabaseOpenHelper myDatabaseOpenHelper;
//會話
private DaoSession daoSession;

//私有構(gòu)造器
private DBManager() {}

/**
*獲取DB管理單一實例
*@return ?DB管理單一實例
*/
public static DBManager getInstance() {
? ? ?if (null == dbManager) {
? ? ? ? ? ? ? synchronized (DBManager.class) {
? ? ? ? ? ? ? ? ? ? if (null == dbManager) {
? ? ? ? ? ? ? ? ? ? ? ? ? dbManager = new DBManager();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ?}
? ? ? }
? ? ? return dbManager;
}

/**
*獲取會話
*@return ? DaoSession
*/
public ?DaoSession ? getDaoSession() {
? if(null==daoSession) {
? ? ? ?synchronized(DBManager.class) {
? ? ? ? ? if(null==daoSession) {
? ? ? ? ? ? ? ?myDatabaseOpenHelper=newMyDatabaseOpenHelper(BaseApplication.getInstance());
? ? ? ? ? ? ? DaoMasterdaoMaster=newDaoMaster(myDatabaseOpenHelper.getWritableDatabase());
? ? ? ? ? ? ? ? //傳入IdentityScopeType.None代表 不使用緩存.
????????????????daoSession= daoMaster.newSession(IdentityScopeType.None);
? ?????????????}
????????}
????????}
? ? ?returndaoSession;
????}
}

//daoMaster.newSession(IdentityScopeType.None);//傳入IdentityScopeType.None代表 不使用緩存 ,不傳參數(shù)默認緩存.

//自定義Application創(chuàng)建Application靜態(tài)實例? (切記要在AndroidManifest修改application的name)
public class ?BaseApplication ? extends ? Application {

? ? private static ?BaseApplication ?baseApplication;

@Override
public void ?onCreate() {
? ? ?super.onCreate();
? ? ?baseApplication=this;
}
/**

*獲取Application實例
*@return
*/
public static ?BaseApplication ?getInstance(){
? ? ? if( ?null== ?baseApplication){
? ? ? ? ? ? ?baseApplication=new ?BaseApplication();
? ? ?}
? ? ? return ?baseApplication;
? ? ?}
}

greenDao核心類構(gòu)成

DaoMaster:

是GreenDao的入口也是greenDao頂級對象,對于一個指定的表單持有數(shù)據(jù)庫對象(SQLite數(shù)據(jù)庫)并且能夠管理DAO類- 能夠創(chuàng)建表和刪除表

其內(nèi)部類OpenHelper 與DevOpenHelper是創(chuàng)建SQlite數(shù)據(jù)庫的SQLiteOpenHelper的具體實現(xiàn)

DaoSession:

對于一個指定的表單可以管理所有的Dao 對象。

也能夠?qū)嶓w類執(zhí)行 insert ,load,update,refresh.delete操作。

DaoSession也能跟蹤 identity scope:即session查詢后的實體會存在緩存中,并給該實體生成一個flag來追蹤該實體,下次再次查詢時會直接從緩存中取出來而不是從數(shù)據(jù)庫中取出來

DAOS

能夠持久訪問和查詢實體類

比起DaoSession有更多的持久化方法 count, loadAll,insertInt等等;

Entities- 自動生成的代碼,一般情況下與javaBean對象的屬性一一對應。


3.創(chuàng)建StudentCRUD(增刪改查)(這個是自己又封裝了一層,數(shù)據(jù)業(yè)務對接層)

public class Student_CRUD {
private StudentEntityDao? studentEntityDao;
public DaoSession daoSession;
//構(gòu)造方法
public Student_CRUD (DaoSession daoSession) {
? this.daoSession= daoSession;
? studentEntityDao= daoSession.getStudentEntityDao();
}
//=========以下 是對 學生表的增刪改查=========
//====增增增增增增增===的方法
????//插入或更新一個學生實體
????public void addStudent(StudentEntity studentEntity) {
????????if(null!= studentEntity) {
????????????studentEntityDao.insertOrReplace(studentEntity);
????????}
????}
????//插入或更新一個學生實體集合
????public void? addStudentList(List<StudentEntity> studentEntityList) {
????????if(null!= studentEntityList && studentEntityList.size() >0) {
????????????studentEntityDao.insertOrReplaceInTx(studentEntityList);
????????}
????}
//=====刪刪刪刪刪刪刪刪===的方法
????//刪除 一條學生數(shù)據(jù)根據(jù)ID
????public void delStudent(long id) {
????????studentEntityDao.deleteByKey(id);
????}
//====改改改改改改改改===的方法
????//修改一條數(shù)據(jù)
????public void updateStudent(StudentEntity studentEntity) {
????????if(null!= studentEntity) {
????????????studentEntityDao.update(studentEntity);
? ? ? ? ? ?}
????}
//====查查查查查查查查======的方法
????//查詢 學生對象根據(jù)ID
????public StudentEntity getStudent(long id){
????????????return studentEntityDao.load(id);
?????}

????//獲取所有 學生數(shù)據(jù)
????public List<StudentEntity> getAll(){
????????return studentEntityDao.loadAll();
?????}
}

未完待續(xù)目錄剩下的部分,望大家多多指點,共同進步,




eq():==

noteq():!=

gt(): >

lt():<

ge:>=

le:<=

like():包含

between:倆者之間

in:在某個值內(nèi)

notIn:不在某個值內(nèi)


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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