GreenDao數(shù)據(jù)庫集成

前言

最近的項(xiàng)目需要使用到數(shù)據(jù)庫飒筑,本來想用Sqlite數(shù)據(jù)來做的,但是聽同事說使用Greendao數(shù)據(jù)庫是真的好用绽昏,我就半信半疑的去網(wǎng)上找了下greendao數(shù)據(jù)庫的資料协屡,以及簡單的使用之后,徹底把我征服了全谤。其實(shí)寫數(shù)據(jù)庫最繁瑣的還是sql語言肤晓,而對于我這樣的數(shù)據(jù)庫小白都可以輕松的使用,實(shí)在是太好用了认然。使用greendao之前我們需要了解的:

認(rèn)識GreenDao之前必須知道ORM(Object Relation Mapping對象關(guān)系映射)补憾,其表現(xiàn)形式就是通過GreenDao將數(shù)據(jù)庫和Bean對象關(guān)聯(lián)起來,其表現(xiàn)形式如下圖

GreenDao的ORM

GreenDao之所以很流行卷员,跟它的優(yōu)點(diǎn)是息息相關(guān)的盈匾,從官網(wǎng)中可以看到這樣一張圖,其表示了在主流的ORM第三方庫中毕骡,其對數(shù)據(jù)庫操作的速度是最快的:


與主流數(shù)據(jù)庫對比

不僅如此削饵,其優(yōu)點(diǎn)還包括有以下幾點(diǎn)

1:存取速度快

2:支持?jǐn)?shù)據(jù)庫加密

3:輕量級

4:激活實(shí)體

5:支持緩存

6:代碼自動

接入greendao到項(xiàng)目

1:需要在項(xiàng)目(Project)的build.gradle中加入依賴:

buildscript {

repositories {

jcenter()

}

dependencies {

classpath'com.android.tools.build:gradle:2.3.1'

// NOTE: Do not place your application dependencies here; they belong

// in the individual module build.gradle files

//GreenDao3.2依賴

classpath'org.greenrobot:greendao-gradle-plugin:3.2.1'

}

}

2:在Moudle的build.gradle文件中添加依賴:

//使用greendao

applyplugin:'org.greenrobot.greendao'

添加依賴(dependencies)中:

//greendao3.2的依賴

compile'org.greenrobot:greendao:3.2.0'

3:添加greendao的數(shù)據(jù)庫配置:

greendao {

schemaVersion 1 ?//數(shù)據(jù)庫版本號 每次升級數(shù)據(jù)庫都需要改變版本岩瘦,只能增加

daoPackage ?'com.pacgename.greendao.gen' ? //設(shè)置DaoMaster、DaoSession葵孤、Dao包名

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

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

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

}

使用GreenDao數(shù)據(jù)庫

一:創(chuàng)建Entity類(相當(dāng)于開發(fā)中的Bean類)

Entity類


Build自動生成需要代碼


自動生成GreenDao

greendao采用注解來創(chuàng)建Entity類尤仍,創(chuàng)建完成之后build自己的Moudlle,會自動生成:

1:Bean實(shí)體的構(gòu)造方法和get狭姨、set方法

2:DaoMaster宰啦、DaoSession、DAOS類 ?這里的類生成我們在Moudle的build.gradle中設(shè)置的

daoPackage路徑

這里對Bean對象的注釋進(jìn)行解釋

@Entity:告訴GreenDao該對象為實(shí)體饼拍,只有被@Entity注釋的Bean類才能被dao類操作

@Id:對象的Id赡模,使用Long類型作為EntityId,否則會報(bào)錯(cuò)师抄。(autoincrement = true)表示主鍵會自增漓柑,如果false就會使用舊值

@Property:可以自定義字段名,注意外鍵不能使用該屬性

@NotNull:屬性不能為空

@Transient:使用該注釋的屬性不會被存入數(shù)據(jù)庫的字段中

@Unique:該屬性值必須在數(shù)據(jù)庫中是唯一值

@Generated:編譯后自動生成的構(gòu)造函數(shù)叨吮、方法等的注釋辆布,提示構(gòu)造函數(shù)、方法等不能被修改

二:創(chuàng)建數(shù)據(jù)庫和表茶鉴,初始化數(shù)據(jù)庫:

public class MyApplication extends Application {

public static ? ?DaoSession ?daoSession;

@Override

public voidonCreate() {

super.onCreate();

setupDatabase();

}

/**

*配置數(shù)據(jù)庫

*/

private voidsetupDatabase() {

//創(chuàng)建數(shù)據(jù)庫book.db"

?DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "book.db", null);

//獲取可寫數(shù)據(jù)庫

SQLiteDatabase db = helper.getWritableDatabase();

//獲取數(shù)據(jù)庫對象

DaoMaster daoMaster =newDaoMaster(db);

//獲取Dao對象管理者

daoSession= daoMaster.newSession();

}

public staticDaoSessiongetDaoInstant() {

returndaoSession;

}

}

可以發(fā)現(xiàn)锋玲,GreenDao已經(jīng)將我們的數(shù)據(jù)庫創(chuàng)建縮成幾句話,代碼會自動將Bean對象創(chuàng)建成表涵叮,不再是傳統(tǒng)的手寫SQL語句惭蹂。這里的數(shù)據(jù)庫創(chuàng)建只需要在Application中執(zhí)行一次即可,這里對幾個(gè)類進(jìn)行解釋

DevOpenHelper:創(chuàng)建SQLite數(shù)據(jù)庫的SQLiteOpenHelper的具體實(shí)現(xiàn)

DaoMaster:GreenDao的頂級對象割粮,作為數(shù)據(jù)庫對象盾碗、用于創(chuàng)建表和刪除表

DaoSession:管理所有的Dao對象,Dao對象中存在著增刪改查等API

由于我們已經(jīng)創(chuàng)建好了DaoSession和Shop的Bean對象舀瓢,編譯后會自動生成我們的ShopDao對象置尔,可通過DaoSession獲得

ShopDao dao = daoSession.getBookDao();

這里的Dao(Data Access Object)是指數(shù)據(jù)訪問接口,即提供了數(shù)據(jù)庫操作一些API接口氢伟,可通過dao進(jìn)行增刪改查操作

數(shù)據(jù)庫和表都已經(jīng)建好了榜轿,我們就只需要去操作數(shù)據(jù)庫了:

三:greendao數(shù)據(jù)庫的基本操作(增,刪朵锣,改谬盐,查)

直接附上代碼:


BookDaobookDao;

@Override

protected voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViewById(R.id.query_user).setOnClickListener(this);

findViewById(R.id.insert_user).setOnClickListener(this);

findViewById(R.id.delete_user).setOnClickListener(this);

BookDao bookDao = MyApplication.getDaoInstant().getBookDao();

}

@Override

public voidonClick(View v) {

switch(v.getId()) {

caseR.id.insert_user:

//插入數(shù)據(jù) 單個(gè)的Book對象

bookDao.insertOrReplace(newBook((long)1,"西游記",20,10));

//插入一個(gè)List數(shù)組? 只要是Iterable的子類都可以插入

List mBookList =newArrayList<>();

mBookList.add(newBook((long)2,"紅樓夢",30,5));

mBookList.add(newBook((long)3,"水滸傳",20,10));

mBookList.add(newBook((long)4,"三國演義",20,10));

mBookList.add(newBook((long)5,"紅樓夢",20,15));

mBookList.add(newBook((long)6,"紅樓西游",20,15));

bookDao.insertOrReplaceInTx(mBookList);

break;

caseR.id.query_user:

//根據(jù)查詢Bookname查詢出來,并且更具id排序诚些,最后返回list數(shù)組

List books =bookDao.queryBuilder().

where(BookDao.Properties.Bookname.eq("紅樓夢")).

orderDesc(BookDao.Properties.Id).list();

//查詢所有的數(shù)據(jù)

List list =bookDao.queryBuilder().list();

break;

caseR.id.delete_user:

//根據(jù)id刪除數(shù)據(jù)

bookDao.deleteByKey((long)1);

break;

caseR.id.update_user:

//其實(shí)插入可以使用插入InsertorReplace來更新數(shù)據(jù)? 根據(jù)id更新

bookDao.update(newBook((long)1,"西游記",10,20));

break;

}

}

四:greendao數(shù)據(jù)庫的混淆

在進(jìn)行打包發(fā)布時(shí)候飞傀,不能混淆掉greendao的類以及數(shù)據(jù),在混淆文件中加入下列代碼:

#greendao3.2.0,此是針對3.2.0皇型,如果是之前的,可能需要更換下包名-keepclassorg.greenrobot.greendao.**{*;}

-keepclassmembersclass*extendsorg.greenrobot.greendao.AbstractDao{publicstaticjava.lang.String TABLENAME;

}

-keepclass**$Properties

關(guān)于GreenDao的的基本概念與基本操作就講到這里砸烦,更多對于GreenDao的數(shù)據(jù)庫操作還需要多多從實(shí)戰(zhàn)中去探索弃鸦,這里只是一個(gè)快速入門的引導(dǎo).GreenDao高級操作還包括有:多表查詢、多表關(guān)聯(lián)幢痘、session緩存等用法唬格,可以到GreenDao的官網(wǎng)進(jìn)行學(xué)習(xí)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颜说,一起剝皮案震驚了整個(gè)濱河市购岗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌门粪,老刑警劉巖喊积,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異玄妈,居然都是意外死亡乾吻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門拟蜻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溶弟,“玉大人,你說我怎么就攤上這事瞭郑」加” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵屈张,是天一觀的道長擒权。 經(jīng)常有香客問我,道長阁谆,這世上最難降的妖魔是什么碳抄? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮场绿,結(jié)果婚禮上剖效,老公的妹妹穿的比我還像新娘。我一直安慰自己焰盗,他們只是感情好璧尸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著熬拒,像睡著了一般爷光。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上澎粟,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天蛀序,我揣著相機(jī)與錄音欢瞪,去河邊找鬼。 笑死徐裸,一個(gè)胖子當(dāng)著我的面吹牛遣鼓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播重贺,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼骑祟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了檬姥?” 一聲冷哼從身側(cè)響起曾我,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤粉怕,失蹤者是張志新(化名)和其女友劉穎健民,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贫贝,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秉犹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了稚晚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崇堵。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖客燕,靈堂內(nèi)的尸體忽然破棺而出鸳劳,到底是詐尸還是另有隱情,我是刑警寧澤也搓,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布赏廓,位于F島的核電站,受9級特大地震影響傍妒,放射性物質(zhì)發(fā)生泄漏幔摸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一颤练、第九天 我趴在偏房一處隱蔽的房頂上張望既忆。 院中可真熱鬧,春花似錦嗦玖、人聲如沸患雇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庆亡。三九已至,卻和暖如春捞稿,著一層夾襖步出監(jiān)牢的瞬間又谋,已是汗流浹背拼缝。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彰亥,地道東北人咧七。 一個(gè)月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像任斋,于是被迫代替她去往敵國和親继阻。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理废酷,服務(wù)發(fā)現(xiàn)瘟檩,斷路器,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 一澈蟆、關(guān)于greenDAO greenDAO應(yīng)該算是當(dāng)前最火的數(shù)據(jù)庫開源框架了墨辛,它是一個(gè)將對象映射到SQLite數(shù)據(jù)...
    當(dāng)幸福來敲門58閱讀 13,870評論 3 19
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法趴俘,內(nèi)部類的語法睹簇,繼承相關(guān)的語法,異常的語法寥闪,線程的語...
    子非魚_t_閱讀 31,622評論 18 399
  • GreenDao 介紹:greenDAO是一個(gè)對象關(guān)系映射(ORM)的框架太惠,能夠提供一個(gè)接口通過操作對象的方式去操...
    小董666閱讀 732評論 0 1
  • 序言 (寫分享前的序言)大家好.很高興能為大家分享Android之GreenDao筆記,也希望能和大家一起學(xué)習(xí)進(jìn)步...
    王黎聰閱讀 1,091評論 4 11