Android GreenDao

1.GreenDao的概述以及特點

基于對象關(guān)系的映射方式來操作數(shù)據(jù)庫的框架莫绣,提供一個接口通過操作對象  
的方式操作數(shù)據(jù)庫

適用于 Android 的ORM 框架,現(xiàn)在市面上主流的框架有 OrmLite牍戚、
SugarORM娄蔼、Active Android、Realm 與 GreenDAO很洋。

GreenDAO是一種Android數(shù)據(jù)庫ORM(對象映射關(guān)系(Object Relation 
Mapping))框架充蓝,與OrmLite、ActiveOrm喉磁、LitePal等數(shù)據(jù)庫相比谓苟,單位時間內(nèi)
可以插入、更新和查詢更多的數(shù)據(jù)协怒,而且提供了大量的靈活通用接口涝焙。

1,通常我們在使用GreenDao的時候孕暇,我們只需定義數(shù)據(jù)模型仑撞,GreenDao框
架將創(chuàng)建數(shù)據(jù)對象(實體)和DAO(數(shù)據(jù)訪問對象),能夠節(jié)省部分代碼妖滔。
2隧哮,不向性能妥協(xié),使用了GreenDao座舍,大多數(shù)實體可以以每秒幾千個實體的
速率進行插入沮翔,更新和加載。
3曲秉,GreenDao支持加密數(shù)據(jù)庫來保護敏感數(shù)據(jù)采蚀。
4疲牵,微小的依賴庫,GreenDao的關(guān)鍵依賴庫大小不超過100kb.
5榆鼠,如果需要瑰步,實體是可以被激活的。而活動實體可以透明的解析關(guān)系(我們
要做的只是調(diào)用getter即可)璧眠,并且有更新缩焦、刪除和刷新方法,以便訪問持久性功能责静。
6袁滥,GreenDao允許您將協(xié)議緩沖區(qū)(protobuf)對象直接保存到數(shù)據(jù)庫中。如果
您通過protobuf通話到您的服務(wù)器灾螃,則不需要另一個映射题翻。常規(guī)實體的所有持久
性操作都可以用于protobuf對象。所以腰鬼,相信這是GreenDao的獨特之處嵌赠。
7,自動生成代碼熄赡,我們無需關(guān)注實體類以及Dao,因為GreenDao已經(jīng)幫我們生成了姜挺。
8,開源 有興趣的同學可以查看源碼彼硫,深入去了解機制炊豪。

2.GreenDao配置依賴

官網(wǎng):
    https://github.com/greenrobot/greenDAO/

配置:
    //1.工程配置:添加插件 更好支持GreenDao
    buildscript {
        repositories {
            jcenter()
            mavenCentral() // 添加的代碼
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.3.3'
            classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
        }
    }

    //2.項目配置:添加插件
    apply plugin: 'com.android.application'
    apply plugin: 'org.greenrobot.greendao' // apply plugin
    
    //3.項目配置:添加依賴
    dependencies {
        //greendao
        implementation 'org.greenrobot:greendao:3.2.2' // add library
    }

    //4.初始化GreenDao配置
    greendao{
        schemaVersion 1 //數(shù)據(jù)庫版本號
        daoPackage 'com.example.lizhengjun.dao'  //數(shù)據(jù)庫全路徑
        targetGenDir 'src/main/java'  //存放位置
    }

    schemaVersion--> 指定數(shù)據(jù)庫schema版本號,遷移等操作會用到;
    daoPackage --> dao的包名拧篮,包名默認是entity所在的包词渤;
    targetGenDir --> 生成數(shù)據(jù)庫文件的目錄;

3.GreenDao的使用思路

//1、配置文件中的設(shè)置
// 在根工程中完成內(nèi)容配置:
buildscript {
    repositories {
        jcenter()
        mavenCentral() // 添加的代碼
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
    }
}
 
//在子工程中完成內(nèi)容配置:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
 
dependencies {
    compile 'org.greenrobot:greendao:3.2.2' // add library
}


2串绩、設(shè)置Green中的DaoMaster/DaoSession/實體類Dao生成路徑
//自定義生成路徑 daoPackage 'a.b.c'
greendao {
    schemaVersion 1
    daoPackage 'com.example.lizhengjun.dao'
    targetGenDir 'src/main/java'
}


3缺虐、設(shè)置實體類
@Entity
public class Student {

    @Id(autoincrement = true)
    private Long id;

    @Property
    @NotNull
    private String name;

    @Property
    private int age;
}

4、文件生成
Build - > ReBuild Project

5礁凡、在Application類中完成內(nèi)容配置(或者使用工具類)

Application有自己的生命周期高氮,OnCreate方法必須首先被調(diào)用
①本類對象的獲取
②DaoMaster、DaoSession對象的獲取
③提供方法把篓,獲取DaoSession對象

需要注意:必須在AndroidManifest.xml文件完成配置
<application
        android:name=".App">
</application>

6纫溃、獲取實體類Dao對象
XXXDao xxxdao =  App.getInstance().getDaoSession().getXXXDao();
xxxdao.增刪改查();

4.GreenDao注解

@Entity   標識實體類,greenDAO會映射成sqlite的一個表韧掩,表名為實體類名的大寫形式
@Id 標識主鍵,該字段的類型為long或Long類型窖铡,autoincrement設(shè)置是否自動增長
@Property       標識該屬性在表中對應(yīng)的列名稱, nameInDb設(shè)置名稱
@Transient      標識該屬性將不會映射到表中疗锐,也就是沒有這列
@NotNull         設(shè)置表中當前列的值不可為空
@Convert         指定自定義類型(@linkPropertyConverter)
@Generated 運行所產(chǎn)生的構(gòu)造函數(shù)或者方法坊谁,被此標注的代碼可以變更或者下次運行時清除
@Index    使用@Index作為一個屬性來創(chuàng)建一個索引;
@JoinEntity     定義表連接關(guān)系
@JoinProperty         定義名稱和引用名稱屬性關(guān)系
@Keep     注解的代碼段在GreenDao下次運行時保持不變
@OrderBy        指定排序方式
@ToMany         定義與多個實體對象的關(guān)系
@ToOne  定義與另一個實體(一個實體對象)的關(guān)系
@Unique 向數(shù)據(jù)庫列添加了一個唯一的約束

/**
 * @Entity
 * @Id(autoincrement = true)  標志主鍵
 * @NotNull 標志這個字段不能是null
 * @Property(nameInDb = "User")
 * @Transient 表示不存儲在數(shù)據(jù)庫中
 * @Index(unique = true)
 * @Unique 用于標志列的值的唯一性滑臊。
 */

5.GreenDao對外提供的核心類簡介

1口芍,DaoMaster
DaoMaster保存數(shù)據(jù)庫對象(SQLiteDatabase)并管理特定模式的Dao類。
它具有靜態(tài)方法來創(chuàng)建表或?qū)⑺麄儎h除雇卷。其內(nèi)部類OpenHelper和    
DevOpenHelper是在SQLite數(shù)據(jù)庫中創(chuàng)建模式的SQLiteOpenHelper實現(xiàn)鬓椭。

2,DaoSession
管理特定模式的所有可用Dao對象关划,您可以使用其中一個getter方法獲取小染。
DaoSession還為實體提供了一些通用的持久性方法,如插入贮折,加載裤翩,更新,刷
新和刪除调榄。最后踊赠,DaoSession對象也跟蹤一個身份范圍。

3每庆,Dao層
數(shù)據(jù)訪問對象(Dao)持續(xù)存在并查詢實體筐带。對于每個實體,GreenDao生成一
個Dao,它比DaoSession有更多的持久化方法缤灵,例如:count,loadAll和insertInTx烫堤。

4,實體
持久對象凤价,通常實體是使用標準Java屬性(如POJO或JavaBean)來表示數(shù)據(jù)庫的對象鸽斟。



1、DevOpenHelper:創(chuàng)建SQLite數(shù)據(jù)庫的SQLiteOpenHelper的具體實現(xiàn)利诺。 
2富蓄、DaoMaster:GreenDao的頂級對象,作為數(shù)據(jù)庫對象慢逾、用于創(chuàng)建表和刪除表立倍。 
3、DaoSession:管理所有的Dao對象侣滩,Dao對象中存在著增刪改查等API口注。

6.GreenDao使用

1.核心使用步驟

//1.創(chuàng)建數(shù)據(jù)庫
DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(MyApp.getMyApp(), "student.db");

//2.獲取讀寫對象
DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());

//3.獲取管理器類
DaoSession daoSession = daoMaster.newSession();

//4.獲取表對象
 studentDao = daoSession.getStudentDao();


daoSession.clear();  清除整個session,沒有緩存對象返回

2.完整使用步驟(Application)

public class App extends Application {

    private StudentDao studentDao;//Dao操作類

    private static App app;

    public static App getInstance() {
        return app;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        //本類對象
        app = this;

        //創(chuàng)建數(shù)據(jù)庫以及創(chuàng)建數(shù)據(jù)表
        createDataBase();
    }

    private void createDataBase() {
        //1.創(chuàng)建數(shù)據(jù)庫
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "student.db");

        //2.獲取讀寫對象
        DaoMaster daoMaster = new DaoMaster(helper.getWritableDatabase());
        
        //3.獲取管理器類
        DaoSession daoSession = daoMaster.newSession();

        //4.獲取表對象
        studentDao = daoSession.getStudentDao();
    }

    public StudentDao getStudentDao() {
        return studentDao;
    }
}

2.完整使用步驟(工具類)

public class MyApp extends Application {

    private static MyApp myApp;

    @Override
    public void onCreate() {
        super.onCreate();

        myApp = this;
    }

    public static MyApp getMyApp() {
        return myApp;
    }
}

<application
    android:name=".MyApp"
    ...>
    
</application>

public class MyDatabaseHelper {

    public StudentDao studentDao;//Dao操作類

    private static MyDatabaseHelper myDatabaseHelper;

    //創(chuàng)建生成數(shù)據(jù)庫
    private MyDatabaseHelper(){

        //1.創(chuàng)建數(shù)據(jù)庫
        DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(MyApp.getMyApp(), "student.db");

        //2.獲取讀寫對象
        DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());

        //3.獲取管理器類
        DaoSession daoSession = daoMaster.newSession();

        //4.獲取表對象
         studentDao = daoSession.getStudentDao();
    }

    public static MyDatabaseHelper getMyDatabaseHelper() {
        if(myDatabaseHelper == null){
            synchronized (MyDatabaseHelper.class){
                if (myDatabaseHelper ==null){
                    myDatabaseHelper = new MyDatabaseHelper();
                }
            }
        }
        return myDatabaseHelper;
    }

    君珠。寝志。。增刪改查操作。材部。宠互。
}

7.GreenDao的增刪改查

1字逗、增     insert
2、刪     deleteByKey
3、改     update
4航邢、查     loadAll


//插入
public void insertAll(List<Student> list){
    studentDao.insertInTx(list);
}

public void insert(Student student){
    studentDao.insert(student);
}

public void insert(Student student){
    studentDao.insertOrReplace(student);
}

//刪除
public void deleteAll(){
    studentDao.deleteAll();
}

public void delete(Student student){
    studentDao.delete(student);
}


//更改
public void updateAll(List<Student> list){
    studentDao.updateInTx(list);
}

public void update(Student student){
    studentDao.update(student);
}

//查詢
public List<Student> queryAll(){
    return  studentDao.queryBuilder().list();
}
public List<Student> queryStudent(Student student){
    return  studentDao.queryBuilder().where(StudentDao.Properties.Name.eq(student.getName())).list();
}
public List<Student> queryStudent2(Student student){
    return  studentDao.queryBuilder().where(StudentDao.Properties.Name.eq(student.getName()),StudentDao.Properties.Age.gt(student.getAge())).list();
}
public List<Student> queryPage(int page,int count){
    return  studentDao.queryBuilder().offset(page*count).limit(count).list();
}

public StudentDao query(PersonInfor studentDao){
    StudentDao oldStudentDao = studentDao.queryBuilder().where(StudentDao.Properties.Id.eq(studentDao.getId())).build().unique();
    return oldStudentDao愤钾;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末笛丙,一起剝皮案震驚了整個濱河市嫉鲸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棵磷,老刑警劉巖蛾狗,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泽本,居然都是意外死亡淘太,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門规丽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒲牧,“玉大人,你說我怎么就攤上這事赌莺”溃” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵艘狭,是天一觀的道長挎扰。 經(jīng)常有香客問我,道長巢音,這世上最難降的妖魔是什么遵倦? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮官撼,結(jié)果婚禮上梧躺,老公的妹妹穿的比我還像新娘。我一直安慰自己傲绣,他們只是感情好掠哥,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秃诵,像睡著了一般续搀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上菠净,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天禁舷,我揣著相機與錄音彪杉,去河邊找鬼。 笑死榛了,一個胖子當著我的面吹牛在讶,可吹牛的內(nèi)容都是我干的煞抬。 我是一名探鬼主播霜大,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼革答!你這毒婦竟也來了战坤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤残拐,失蹤者是張志新(化名)和其女友劉穎途茫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溪食,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡囊卜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了错沃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栅组。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖枢析,靈堂內(nèi)的尸體忽然破棺而出玉掸,到底是詐尸還是另有隱情,我是刑警寧澤醒叁,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布司浪,位于F島的核電站,受9級特大地震影響把沼,放射性物質(zhì)發(fā)生泄漏啊易。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一饮睬、第九天 我趴在偏房一處隱蔽的房頂上張望租谈。 院中可真熱鬧,春花似錦续捂、人聲如沸垦垂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劫拗。三九已至,卻和暖如春矾克,著一層夾襖步出監(jiān)牢的瞬間页慷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酒繁,地道東北人滓彰。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像州袒,于是被迫代替她去往敵國和親揭绑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355