Android的GreenDao3.0數(shù)據(jù)庫詳解及使用

GreenDao 是一個(gè)將對(duì)象映射到 SQLite 數(shù)據(jù)庫中的輕量且快速的 ORM 解決方案摇幻。

性能(官網(wǎng)上的解釋)

我們知道所有的ORM的颓芭,greenDAO是最快的顷锰。greenDAO不作性能方面任何妥協(xié)。數(shù)據(jù)庫是非常適合存儲(chǔ)大量數(shù)據(jù)亡问,從而加速事項(xiàng)官紫。使用greenDAO,大多數(shù)實(shí)體可以插入州藕,更新和在速率加載每秒幾千實(shí)體万矾。我們?cè)趃reenDAO的表現(xiàn)充滿信心,并邀請(qǐng)您比較greenDAO對(duì)其他的框架慎框。我們開源了我們的測(cè)試充分的透明度良狈。下圖比較了Android的greenDAO,OrmLite和ActiveAndroid 3個(gè)最流行的ORM解決方案(根據(jù)基于GitHub上星和Appbrain的統(tǒng)計(jì)普及)笨枯。greenDAO插入和更新實(shí)體快約2倍薪丁,并圍繞比ORMLite快4倍的負(fù)載實(shí)體遇西。典型應(yīng)用的加載速度是最相關(guān)的。

一严嗜、GreenDao配置

  1. 配置項(xiàng)目的build.gradle
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'

配置位置如圖:

配置1.png

2.配置Model的build.gradle

1)添加第一處
apply plugin: 'org.greenrobot.greendao'
2)添加第二處
compile 'org.greenrobot:greendao:3.2.2'
compile 'org.greenrobot:greendao-generator:3.2.2'
3)添加第三處
 greendao {
        //指定數(shù)據(jù)庫schema版本號(hào)粱檀,遷移等操作會(huì)用到
        schemaVersion 3
        //DaoSession、DaoMaster以及所有實(shí)體類的dao生成的目錄,默認(rèn)為你的entity所在的包名
        //daoPackage 包名
        daoPackage 'com.example.tianmei.myapplication.greendao.gen'
        //這就是我們上面說到的自定義生成數(shù)據(jù)庫文件的目錄了漫玄,可以將生成的文件放到我們的java目錄中茄蚯,而不是build中,這樣就不用額外的設(shè)置資源目錄了
        //工程路徑 
        targetGenDir 'src/main/java'
}

配置位置如圖:


配置2.png

3.編寫entity類睦优,創(chuàng)建實(shí)體類

//@Entity 將我們的java普通類變?yōu)橐粋€(gè)能夠被greenDAO識(shí)別的數(shù)據(jù)庫類型的實(shí)體類
@Entity
public class Person {
    //@Id:通過這個(gè)注解標(biāo)記的字段必須是Long類型的渗常,這個(gè)字段在數(shù)據(jù)庫中表示它就是主鍵,并且它默認(rèn)就是自增的
    @Id
    private int Id;
    private String UserName;
    private String PassWord;
    //@Transient:表明這個(gè)字段不會(huì)被寫入數(shù)據(jù)庫汗盘,只是作為一個(gè)普通的java類字段皱碘,用來臨時(shí)存儲(chǔ)數(shù)據(jù)的,不會(huì)被持久化
    @Transient
    private String Mobile; // not persisted
}

注:
@Id注解選擇 long / Long 屬性作為實(shí)體ID隐孽。在數(shù)據(jù)庫術(shù)語中癌椿,它是主鍵。參數(shù)自動(dòng)增量菱阵,是使ID值不斷增加(不會(huì)選用舊值)的標(biāo)志踢俄。
@Property讓你定義一個(gè)非默認(rèn)的列名,其屬性映射到晴及。如果不存在都办,greenDAO將在SQL雜交方式使用字段名(大寫,下劃線抗俄,而不是駱駝情況下脆丁,例如 customName將成為 CUSTOM_NAME)。注意:您目前只能使用內(nèi)聯(lián)常量來指定列名动雹。
@NotNull makes the property a “NOT NULL” column on the database side槽卫。通常是有意義的紀(jì)念原始類型(long, int, short, byte)與@NotNull,同時(shí)具有包裝類(Long, Integer, Short, Byte)空的值胰蝠。
@Transient表明這個(gè)字段不會(huì)被寫入數(shù)據(jù)庫歼培,只是作為一個(gè)普通的java類字段,用來臨時(shí)存儲(chǔ)數(shù)據(jù)的茸塞,不會(huì)被持久化
@Entity 定義實(shí)體
@nameInDb 在數(shù)據(jù)庫中的名字躲庄,如不寫則為實(shí)體中類名
@indexes 索引
@createInDb 是否創(chuàng)建表,默認(rèn)為true,false時(shí)不創(chuàng)建
@schema 指定架構(gòu)名稱為實(shí)體
@active 無論是更新生成都刷新
@Id
@NotNull 不為null
@Unique 唯一約束
@ToMany 一對(duì)多
@OrderBy 排序
@ToOne 一對(duì)一
@Transient 不存儲(chǔ)在數(shù)據(jù)庫中
@generated 由greendao產(chǎn)生的構(gòu)造函數(shù)或方法

4.MakeProject 編譯項(xiàng)目钾虐,User實(shí)體類會(huì)自動(dòng)編譯噪窘,生成get、set方法并且會(huì)在com.example.tianmei.myapplication.greendao.gen

Model.png

二效扫、GreenDao使用

  1. 聲明屬性
    private DaoMaster.DevOpenHelper mHelper;
    private SQLiteDatabase db;
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;
    private PersonDao personDao;
    public static BlankFragment1 instances;
  1. 初始化greenDao方法
    DaoMaster:使用greenDAO的切入點(diǎn)倔监。 DaoMaster保存數(shù)據(jù)庫對(duì)象(SQLiteDatabase)并管理特定模式的DAO類(而不是對(duì)象)直砂。它有靜態(tài)方法來創(chuàng)建表或刪除它們。它的內(nèi)部類OpenHelper和DevOpenHelper是SQLiteOpenHelper實(shí)現(xiàn)浩习,在SQLite數(shù)據(jù)庫中創(chuàng)建模式静暂。
    DaoSession:管理特定模式的所有可用DAO對(duì)象,您可以使用其中一個(gè)getter方法獲取谱秽。 DaoSession還為實(shí)體提供了一些通用的持久性方法洽蛀,如插入,加載疟赊,更新郊供,刷新和刪除。最后听绳,DaoSession對(duì)象也跟蹤標(biāo)識(shí)范圍颂碘。
    DAO:數(shù)據(jù)訪問對(duì)象(DAO)持續(xù)并查詢實(shí)體异赫。對(duì)于每個(gè)實(shí)體椅挣,greenDAO生成DAO。它具有比DaoSession更多的持久化方法塔拳,例如:count鼠证,loadAll和insertInTx。
    實(shí)體:持久對(duì)象靠抑。通常量九,實(shí)體是使用標(biāo)準(zhǔn)Java屬性(如POJO或JavaBean)表示數(shù)據(jù)庫行的對(duì)象。
    /**
     * 設(shè)置greenDao
     */
    private void setDatabase() {
        // 通過 DaoMaster 的內(nèi)部類 DevOpenHelper颂碧,你可以得到一個(gè)便利的 SQLiteOpenHelper 對(duì)象荠列。
        // 可能你已經(jīng)注意到了,你并不需要去編寫「CREATE TABLE」這樣的 SQL 語句载城,因?yàn)?greenDAO 已經(jīng)幫你做了肌似。
        // 注意:默認(rèn)的 DaoMaster.DevOpenHelper 會(huì)在數(shù)據(jù)庫升級(jí)時(shí),刪除所有的表诉瓦,意味著這將導(dǎo)致數(shù)據(jù)的丟失川队。
        // 所以,在正式的項(xiàng)目中睬澡,你還應(yīng)該做一層封裝固额,來實(shí)現(xiàn)數(shù)據(jù)庫的安全升級(jí)。
        mHelper = new DaoMaster.DevOpenHelper(getActivity(), "notes-db", null);
        db = mHelper.getWritableDatabase();
        // 注意:該數(shù)據(jù)庫連接屬于 DaoMaster煞聪,所以多個(gè) Session 指的是相同的數(shù)據(jù)庫連接斗躏。
        mDaoMaster = new DaoMaster(db);
        mDaoSession = mDaoMaster.newSession();
    }
    public static BlankFragment1 getInstances(){
        return instances;
    }
    public DaoSession getDaoSession() {
        return mDaoSession;
    }
    public SQLiteDatabase getDb() {
        return db;
    }
  1. 在主方法中調(diào)用
//設(shè)置greenDao
        setDatabase();
  1. 獲取Person對(duì)象
personDao = getDaoSession().getPersonDao();

三、用法(增刪改查操作)

1昔脯、插入數(shù)據(jù)

        //新建一個(gè)對(duì)象
        Person person = new Person(null, "sc", "123");
        //插入
        personDao.insert(person);

2啄糙、查找數(shù)據(jù)

        List<Person> personList = personDao.queryBuilder()
                .where(PersonDao.Properties.Id.notEq(999))
                .orderAsc(PersonDao.Properties.Id)
                .limit(5)
                .build().list();

3馋艺、修改數(shù)據(jù)

        //1.where是查詢條件,
        //2.unique()表示查詢結(jié)果為一條數(shù)據(jù)迈套,若數(shù)據(jù)不存在捐祠,findUser為null。
        Person person = personDao.queryBuilder().where(PersonDao.Properties.UserName.eq("sc")).build().unique();
        if(person != null) {
            person.setUserName("lm");
            // update為更新
            personDao.update(person);
            Toast.makeText(getActivity(), "修改成功", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(getActivity(), "用戶不存在", Toast.LENGTH_SHORT).show();
        }

4桑李、刪除數(shù)據(jù)

        Person person  = personDao.queryBuilder().where(PersonDao.Properties.UserName.eq("sc")).build().unique();
        if(person != null){
            //通過Key來刪除踱蛀,這里的Key就是user字段中的ID號(hào)
            personDao.deleteByKey(person.getId());
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贵白,隨后出現(xiàn)的幾起案子率拒,更是在濱河造成了極大的恐慌,老刑警劉巖禁荒,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猬膨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡呛伴,警方通過查閱死者的電腦和手機(jī)勃痴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來热康,“玉大人沛申,你說我怎么就攤上這事〗憔” “怎么了铁材?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)奕锌。 經(jīng)常有香客問我著觉,道長(zhǎng),這世上最難降的妖魔是什么惊暴? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任饼丘,我火速辦了婚禮,結(jié)果婚禮上缴守,老公的妹妹穿的比我還像新娘葬毫。我一直安慰自己,他們只是感情好屡穗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布贴捡。 她就那樣靜靜地躺著,像睡著了一般村砂。 火紅的嫁衣襯著肌膚如雪烂斋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音汛骂,去河邊找鬼罕模。 笑死,一個(gè)胖子當(dāng)著我的面吹牛帘瞭,可吹牛的內(nèi)容都是我干的淑掌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼蝶念,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼抛腕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起媒殉,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤担敌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后廷蓉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體全封,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年桃犬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刹悴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疫萤,死狀恐怖颂跨,靈堂內(nèi)的尸體忽然破棺而出敢伸,到底是詐尸還是另有隱情扯饶,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布池颈,位于F島的核電站尾序,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏躯砰。R本人自食惡果不足惜每币,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望琢歇。 院中可真熱鬧兰怠,春花似錦、人聲如沸李茫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽魄宏。三九已至秸侣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背味榛。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工椭坚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搏色。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓善茎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親频轿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巾表,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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