【Android】ORM框架greenDao 2

作者:鄒峰立萝招,微博:zrunker,郵箱:zrunker@yahoo.com朴爬,微信公眾號(hào):書(shū)客創(chuàng)作即寒,個(gè)人平臺(tái):www.ibooker.cc

本文選自書(shū)客創(chuàng)作平臺(tái)第9篇文章召噩。閱讀原文 母赵。

書(shū)客創(chuàng)作

在了解greenDao之前首要知道什么是SQLite,什么是ORM具滴?
SQLite是一款輕量級(jí)嵌入式關(guān)系型數(shù)據(jù)庫(kù)凹嘲,也是移動(dòng)端最為常用的一種關(guān)系型數(shù)據(jù)庫(kù)。
ORM對(duì)象關(guān)系映射构韵,簡(jiǎn)單一點(diǎn)說(shuō)就是實(shí)現(xiàn)數(shù)據(jù)庫(kù)表結(jié)構(gòu)與對(duì)象一一對(duì)印周蹭。

對(duì)象關(guān)系映射

greenDao簡(jiǎn)介

官網(wǎng)解釋:greenDAO: Android ORM for your SQLite database。
greenDAO是Android中對(duì)SQLite進(jìn)行對(duì)象關(guān)系映射的一個(gè)框架疲恢。

greenDao之所以很流行凶朗,跟它的優(yōu)點(diǎn)是息息相關(guān)的:

  • 一個(gè)精簡(jiǎn)的庫(kù)
  • 性能最大化
  • 內(nèi)存開(kāi)銷最小化
  • 易于使用的 API
  • 對(duì) Android 進(jìn)行高度優(yōu)化

Android中ORM框架有很多,如OrmLite显拳,ActiveAndroid等棚愤,但是相對(duì)而言,greenDao性能更加優(yōu)秀杂数。


常用orm框架對(duì)比圖

greenDao-Generator2使用

在使用greenDao之前要生成相應(yīng)的表宛畦,Bean,Dao文件等揍移,這個(gè)生成過(guò)程可以利用Eclipse/MyEclipse/Android Studio等相關(guān)工具來(lái)實(shí)現(xiàn)次和。
如果使用Eclipse/MyEclipse實(shí)現(xiàn),需要添加greendao-generator:2.1.0和freemaker兩個(gè)jar那伐。
如果使用Android Studio實(shí)現(xiàn)踏施,只要在創(chuàng)建的Java Module中添加greendao-generator:2.1.0即可。
下面將以Android Studio為例罕邀,實(shí)現(xiàn)這一功能读规。

配置:首先創(chuàng)建一個(gè)Android工程,然后添加一個(gè)Module(Java Library)燃少,最后在Module的build.gradle文件中中添加greendao-generator:2.1.0依賴束亏。

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'de.greenrobot:greendao-generator:2.1.0'
}

使用:greendao-generator是用來(lái)生成相應(yīng)的表,Bean阵具,Dao文件等碍遍。假如要生成一個(gè)用戶表定铜,一個(gè)朋友表,一個(gè)用戶可以有多個(gè)朋友怕敬,一個(gè)朋友數(shù)據(jù)最多對(duì)應(yīng)一個(gè)用戶揣炕,那么該如何實(shí)現(xiàn)呢?

public class ZGenerator {
    public static void main(String args[]) {
        // 創(chuàng)建一個(gè)模式Shcema
        // 參數(shù)1-版本东跪,參數(shù)2-包名
        Schema schema = new Schema(1, "cc.ibooker.daogenerator");

        // 添加Entity-相當(dāng)于表-用戶對(duì)象
        // 參數(shù)-代表生成對(duì)象類名
        Entity user = schema.addEntity("User");
        user.addIdProperty().autoincrement();// 添加ID-自增
        user.addLongProperty("uId");
        user.addStringProperty("uRealname");
        user.addStringProperty("uSex");
        user.addStringProperty("uBirthday");
        user.addFloatProperty("uHeight");
        user.addFloatProperty("uWeight");
        user.addStringProperty("uDomicile");
        user.addLongProperty("uPhone");
        user.addStringProperty("uEmail");
        user.addStringProperty("uWeibo");

        // 朋友表/對(duì)象
        Entity friend = schema.addEntity("Friend");
        friend.addIdProperty().autoincrement();// 添加ID-自增
        friend.addStringProperty("fGname");
        // 添加外鍵-只能關(guān)聯(lián)User主鍵
        Property fUid = friend.addLongProperty("fUid").getProperty();

        friend.addToOne(user, fUid);// 一對(duì)一
        user.addToMany(friend, fUid).setName("friends");// 一對(duì)多

        // 生成相關(guān)文件
        try {
            // 參數(shù)1-schema畸陡,參數(shù)2-生成路徑
            new DaoGenerator().generateAll(schema, "app/src/main/java");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1、創(chuàng)建Schema(設(shè)置模式)

/**
 * @param version 版本號(hào)-可以理解為數(shù)據(jù)庫(kù)版本號(hào)
 * @param defaultJavaPackage 默認(rèn)包名-即文件生成路徑
 **/
Schema schema = new Schema(int version, String defaultJavaPackage);

2虽填、添加表對(duì)象

/**
 * @param className 生成Bean文件的類名
 **/
Entity entity = schema.addEntity(String className);
// 添加主鍵-并實(shí)現(xiàn)主鍵自增
entity.addIdProperty().autoincrement();
// 添加字段名-根據(jù)添加類型進(jìn)行設(shè)置
entity.addStringProperty(String propertyName);
entity.addLongProperty(String propertyName);

添加外鍵-只能關(guān)聯(lián)主鍵

// 添加外鍵-只能關(guān)聯(lián)User主鍵
Property property = entity.addLongProperty(String propertyName).getProperty();

一對(duì)一關(guān)聯(lián)

/**
 * @param target 目標(biāo)表對(duì)象(關(guān)聯(lián)對(duì)象)
 * @param fkProperty 外鍵
 **/
entity.addToOne(Entity target, Property fkProperty);

一對(duì)多關(guān)聯(lián)

/**
 * @param target 目標(biāo)表對(duì)象(關(guān)聯(lián)對(duì)象)
 * @param fkProperty 外鍵
 **/
ToMany tomany = entity.addToMany(Entity target, Property fkProperty);
// 設(shè)置外鍵對(duì)象名稱
tomany.setName(String name);

3丁恭、編譯執(zhí)行

try {
    // 參數(shù)1-schema,參數(shù)2-生成根路徑
    new DaoGenerator().generateAll(schema, "app/src/main/java");
} catch (Exception e) {
    e.printStackTrace();
}
Generator生成結(jié)構(gòu)圖

greenDao2使用

配置:在build.gradle(app)中加入greendao:2.1.0依賴斋日。

dependencies {
    compile 'de.greenrobot:greendao:2.1.0'
}

使用:greendao:2.1.0主要是用來(lái)操作數(shù)據(jù)庫(kù)牲览,而對(duì)于數(shù)據(jù)庫(kù)的操作主要是增刪改查。
在實(shí)現(xiàn)數(shù)據(jù)庫(kù)增刪改查之前必須對(duì)相關(guān)Dao文件進(jìn)行實(shí)例化恶守,那么該如何進(jìn)行實(shí)例化呢第献?

// 獲取一個(gè)可讀可寫數(shù)據(jù)庫(kù)對(duì)象,參數(shù)1-上下文對(duì)象兔港,參數(shù)2-數(shù)據(jù)庫(kù)名稱庸毫,參數(shù)3-游標(biāo)工廠CursorFactory
SQLiteDatabase db = new DaoMaster.DevOpenHelper(this, "ibookerdata.db", null).getWritableDatabase();
// 獲取DAO模式
DaoMaster daoMaster = new DaoMaster(db);
DaoSession daoSession = daoMaster.newSession();
FriendDao friendDao = daoSession.getFriendDao();
UserDao userDao = daoSession.getUserDao();

對(duì)Dao對(duì)象進(jìn)行實(shí)例化之后,就可以通過(guò)相關(guān)Dao來(lái)操作相關(guān)表衫樊。
1岔绸、插入數(shù)據(jù)-GreenDao可以實(shí)現(xiàn)單一對(duì)象插入和批量插入功能。

  • 插入一條數(shù)據(jù)
// 參數(shù)為User對(duì)象
long id = userDao.insert(User user);
  • 批量插入數(shù)據(jù)
// 參數(shù)為User對(duì)象集
userDao.insertInTx(List<User> users);

2橡伞、修改數(shù)據(jù)-GreenDao可以實(shí)現(xiàn)單一對(duì)象修改和批量修改功能。

  • 修改一條數(shù)據(jù)
// 參數(shù)為User對(duì)象
userDao.update(User user);
  • 批量修改數(shù)據(jù)
// 參數(shù)為User對(duì)象集
userDao.updateInTx(List<User> users);

3晋被、刪除數(shù)據(jù)

  • 刪除一條數(shù)據(jù)
userDao.delete(User user);
  • 根據(jù)主鍵ID刪除數(shù)據(jù)
userDao.deleteByKey(K key);
  • 批量刪除數(shù)據(jù)
userDao.deleteInTx(List<User> users);
  • 刪除所有數(shù)據(jù)
userDao.deleteAll();

4兑徘、查詢數(shù)據(jù)

  • 查詢所有數(shù)據(jù)-三種方式
// 方式一
List<User> list = userDao.queryBuilder().list();
// 方式二
List<User> list = new ArrayList<>();
Iterator iterator = userDao.queryBuilder().listIterator();
while (iterator.hasNext()) {
     User user = (User) iterator.next();
     // 一般用來(lái)篩選需要的對(duì)象
     list.add(user);
}
// 方式三
userDao.loadAll();
  • 懶加載-記得使用完之后關(guān)閉掉close
LazyList<User> list = userDao.queryBuilder().listLazy();
list.close();
  • 條件查詢
// keyWord為關(guān)鍵字
// 查詢相等數(shù)據(jù)
userDao.queryBuilder().where(UserDao.Properties.URealname.eq(keyWord)).unique();
// 查詢相等數(shù)據(jù)集
userDao.queryBuilder().where(UserDao.Properties.URealname.eq(keyWord)).list();
// 查詢不相等數(shù)據(jù)
userDao.queryBuilder().where(UserDao.Properties.URealname.notEq(keyWord)).list();
// 模糊查詢
userDao.queryBuilder().where(UserDao.Properties.UBirthday.like("%" + keyWord + "%")).list();
// 范圍查詢-minValue最小值,maxValue最大值
userDao.queryBuilder().where(UserDao.Properties.UBirthday.between(minValue, maxValue)).list();
// 查詢大于
userDao.queryBuilder().where(UserDao.Properties.UHeight.gt(keyWord)).list();
// 大于等于
userDao.queryBuilder().where(UserDao.Properties.UHeight.ge(keyWord)).list();
// 小于
userDao.queryBuilder().where(UserDao.Properties.UWeight.lt(keyWord)).list();
// 小于等于
userDao.queryBuilder().where(UserDao.Properties.UWeight.le(keyWord)).list();
// 升序查詢
userDao.queryBuilder().orderAsc(UserDao.Properties.Id).list();
// 倒序查詢
userDao.queryBuilder().orderDesc(UserDao.Properties.Id).list();
  • 原生SQL查詢
// 查詢有朋友的用戶信息
String sql = "_id in (select f_uid from friend)";
userDao.queryBuilder().where(new WhereCondition.StringCondition(sql)).list();
  • 線程查詢
final Query query = userDao.queryBuilder().build();
new Thread(new Runnable() {
     @Override
     public void run() {
         query.forCurrentThread().list();
     }
}).start();
  • 一對(duì)一查詢
List<Friend> list = friendDao.queryBuilder().list();
for (Friend friend : list) {
    User user = friend.getUser();
}
  • 一對(duì)多查詢
List<User> list = userDao.queryBuilder().list();
for (User user : list) {
    List<Friend> friends = user.getFriends();
}

greenDao提供了很多方法羡洛,這里只是寫了一些常用方法挂脑。

GitHub地址
閱讀原文


微信公眾號(hào):書(shū)客創(chuàng)作
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市欲侮,隨后出現(xiàn)的幾起案子崭闲,更是在濱河造成了極大的恐慌,老刑警劉巖威蕉,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刁俭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡韧涨,警方通過(guò)查閱死者的電腦和手機(jī)牍戚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門侮繁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人如孝,你說(shuō)我怎么就攤上這事宪哩。” “怎么了第晰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵锁孟,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我茁瘦,道長(zhǎng)品抽,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任腹躁,我火速辦了婚禮桑包,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纺非。我一直安慰自己哑了,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布烧颖。 她就那樣靜靜地躺著弱左,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炕淮。 梳的紋絲不亂的頭發(fā)上拆火,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音涂圆,去河邊找鬼们镜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛润歉,可吹牛的內(nèi)容都是我干的模狭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼踩衩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嚼鹉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起驱富,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锚赤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后褐鸥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體线脚,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酒贬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片又憨。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锭吨,靈堂內(nèi)的尸體忽然破棺而出蠢莺,到底是詐尸還是另有隱情,我是刑警寧澤零如,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布躏将,位于F島的核電站,受9級(jí)特大地震影響考蕾,放射性物質(zhì)發(fā)生泄漏祸憋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一肖卧、第九天 我趴在偏房一處隱蔽的房頂上張望蚯窥。 院中可真熱鬧,春花似錦塞帐、人聲如沸拦赠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)棚点。三九已至俊扳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奏路,已是汗流浹背费彼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工茫因, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留削咆,地道東北人牍疏。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拨齐,于是被迫代替她去往敵國(guó)和親鳞陨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,515評(píng)論 25 707
  • 前言 我相信奏黑,在平時(shí)的開(kāi)發(fā)過(guò)程中,大家一定會(huì)或多或少地接觸到SQLite编矾。然而在使用它時(shí)熟史,我們往往需要做許多額外的...
    勤奮的pangdunhu閱讀 1,995評(píng)論 1 11
  • 1.下拉刷新 Android-Ptr-Comparison-Android 下拉刷新開(kāi)源庫(kù)對(duì)比,非常niceU巍蹂匹! ...
    碼小趣閱讀 9,480評(píng)論 3 131
  • 滾燙的炙熱,狠狠的烙印凹蜈,群魔亂舞的撕扯限寞。 泣聲哽咽忍啸,涕泗橫流,然偽作欣悅焉履植。 哪來(lái)那么多少不更事计雌,又或者年少輕狂!...
    Shirmay閱讀 245評(píng)論 0 0
  • 文/海芬 青花瓷的酒盅 斟滿玉液瓊漿 酒瓶的火紅似主人一樣熱情 青花碰出了 最美的交響曲 醇香酒滴灑落宣紙 成了勵(lì)...
    海語(yǔ)天籟閱讀 169評(píng)論 3 10