ORM框架之GreenDao3.0使用詳解(二)

本文介紹

上一篇講解了GreenDao3.0如何集成環(huán)境與添加各類注解,這一篇我們來看看如何使用GreenDao實(shí)現(xiàn)數(shù)據(jù)庫(kù)增刪改查的功能蚂且,還是上一篇公司Company與雇員Employee的例子。

數(shù)據(jù)庫(kù)初始化

首先初始化數(shù)據(jù)庫(kù)與表涮帘,可封裝一個(gè)工具類豫缨,這里獻(xiàn)上我的:

public class GreenDaoUtil {
    private static DaoSession daoSession;
    private static SQLiteDatabase database;
    /**
     * 初始化數(shù)據(jù)庫(kù)
     * 建議放在Application中執(zhí)行
     */
    public static void initDataBase(Context context) {
        //通過DaoMaster的內(nèi)部類DevOpenHelper,可得到一個(gè)SQLiteOpenHelper對(duì)象赶促。
        DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper
        (context, "greendaoutil.db", null); //數(shù)據(jù)庫(kù)名稱
        database = devOpenHelper.getWritableDatabase();
        DaoMaster daoMaster = new DaoMaster(database);
        daoSession = daoMaster.newSession();
    }
    
    public static DaoSession getDaoSession() {
        return daoSession;
    }

    public static SQLiteDatabase getDatabase() {
        return database;
    }
}

然后在Application中調(diào)用。

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        GreenDaoUtil.initDataBase(getApplicationContext());
    }
}

插入

插入公司與雇員的假數(shù)據(jù):

//獲取實(shí)體Dao
CompanyDao companyDao = GreenDaoUtil.getDaoSession().getCompanyDao();
EmployeeDao employeeDao = GreenDaoUtil.getDaoSession().getEmployeeDao();
//插入公司
Company company1 = new Company();
company1.setId(null);
company1.setCompanyName("Netease");
company1.setIndustry("news");
Company company2 = new Company();
company2.setId(null);
company2.setCompanyName("Tencent");
company2.setIndustry("chat");
companyDao.insert(company1);
companyDao.insert(company2);

//插入不同公司的雇員
for (int i = 0; i < 5; i++) {
    Employee employee = new Employee(null, company1.getId(), "Sherlock" + i, 11000 + i * 1000);
    employeeDao.insert(employee);
}
for (int i = 0; i < 5; i++) {
    Employee employee = new Employee(null, company2.getId(), "Richard" + i, 8000 + i * 1000);
    employeeDao.insert(employee);
}

注意:設(shè)置setId(null)挟炬,GreenDao會(huì)自動(dòng)分配自增Id鸥滨。

查詢

由于刪除與更新基本都需要先進(jìn)行查詢嗦哆,所以咱們來看看如何進(jìn)行查詢:

QueryBuilder

舉例:查詢Tencent公司中薪水大于等于10000的職員。

//查詢Company表中名為Tencent的公司
Company company = companyDao.queryBuilder()
.where(CompanyDao.Properties.CompanyName.eq("Tencent"))
.unique();
//查詢Employee表中屬于Tencent公司且薪水水大于等于10000的Employee
List<Employee> employeeList = employeeDao.queryBuilder()
.where(EmployeeDao.Properties.CompanyId.eq(company.getId()), 
EmployeeDao.Properties.Salary.ge(10000))
.list();

注意:如果查詢調(diào)用.unique()的話婿滓,需注意本次查詢的結(jié)果必須唯一老速,否則會(huì)報(bào)錯(cuò)。where中為查詢條件凸主,支持多條件查詢以" , "隔開橘券。

Query

使用Query可進(jìn)行重復(fù)查詢,更改查詢條件參數(shù)即可卿吐,還是上面的例子旁舰。

//查詢Company表中名為Tencent的公司
Company company = companyDao.queryBuilder()
.where(CompanyDao.Properties.CompanyName.eq("Tencent"))
.unique();
//查詢Employee表中屬于Tencent公司且薪水水大于等于10000的Employee
Query query = employeeDao.queryBuilder()
.where(EmployeeDao.Properties.CompanyId.eq(company.getId()), 
EmployeeDao.Properties.Salary.ge(10000))
.build();
//修改查詢條件參數(shù)
query.setParameter(0, company.getId());
query.setParameter(1, 11000);
List<Employee> employeeList = query.list();

load(Long key)

根據(jù)主鍵查詢一條記錄

Company company =  companyDao.load(1l);

loadAll()

查詢表中所有記錄

List<Company> companyList = companyDao.loadAll();
List<Employee> employeeList = employeeDao.loadAll();

原聲sql查詢

推薦通過QueryBuilder和WhereCondition.StringCondition來實(shí)現(xiàn)原聲sql查詢。

Query query = companyDao.queryBuilder()
.where( new StringCondition("_ID IN " + "(SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)"))
.build();

也可使用queryRaw()或queryRawCreate()方法來實(shí)現(xiàn)但两。

多線程查詢

如果數(shù)據(jù)量過大鬓梅,對(duì)于數(shù)據(jù)庫(kù)查詢的操作是很耗時(shí)的,所以需要開啟新的線程進(jìn)行查詢谨湘。

private void queryThread() {
    final Query query = employeeDao.queryBuilder().build();
    new Thread(){
        @Override
        public void run() {
            List list = query.forCurrentThread().list();
        }
    }.start();
}

查詢條件判斷

eq,noteq與like查詢
  • eq判斷值是否相等,通常用來具體查找芥丧,返回一條指定類型數(shù)據(jù)紧阔。
  • noteq與eq相反,判斷值是否不等续担,通常用來模糊查找擅耽,返回指定類型的集合。
  • like相當(dāng)于通配符查詢物遇,包含查詢值的實(shí)體都會(huì)返回乖仇,同樣模糊查找,返回指定類型的集合询兴。
>乃沙、<、>=诗舰、<=查詢

分別對(duì)應(yīng)方法:
  >: gt()
  <: lt()
  >=: ge()
  <=: le()

isNull與isNotNull

為空與不為空警儒,判斷數(shù)據(jù)庫(kù)中有無數(shù)據(jù)。

排序

對(duì)查詢結(jié)果進(jìn)行排序眶根,有升序與降序蜀铲。

List<Employee> employeeList = employeeDao.queryBuilder()
.where(EmployeeDao.Properties.CompanyId.eq(company.getId()))
.orderAsc(EmployeeDao.Properties.Salary)
.list();

上例中的.orderAsc(EmployeeDao.Properties.Salary)就是對(duì)查詢出來的Employee按工資進(jìn)行升序排序。同理降序?yàn)?code>.orderDesc(EmployeeDao.Properties.Salary)属百。

刪除

刪除主要有三種方式:

deleteBykey(Long key)

根據(jù)key進(jìn)行刪除记劝。舉例:刪除Tencent公司中薪水小于10000的人,需先查詢出Employee表中屬于Tencent公司且薪水小于10000的Employee實(shí)體族扰,再進(jìn)行刪除厌丑。

//查詢Company表中名為Tencent的公司
Company companyTencent = companyDao.queryBuilder()
.where(CompanyDao.Properties.CompanyName.eq("Tencent"))
.unique();
if (companyTencent != null) {
    //查詢Employee表中屬于Tencent公司且薪水小于10000的Employee
    List<Employee> employeeList = employeeDao.queryBuilder()
    .where(EmployeeDao.Properties.CompanyId.eq(companyTencent.getId()), 
    EmployeeDao.Properties.Salary.lt(10000))
    .list();
    if (employeeList != null) {
        for (Employee employee : employeeList) {
            //進(jìn)行刪除
            employeeDao.deleteByKey(employee.getId());
        }
    } else {
        Log.e("greendao_test", "delete:deleteList為空");
    }
} else {
    Log.e("greendao_test", "delete:company為空");
}

delete(Employee entity)

根據(jù)實(shí)體進(jìn)行刪除钳恕。舉例:刪除名為Tencent的公司。

//查詢Company表中名為Tencent的公司
Company companyTencent = companyDao.queryBuilder()
.where(CompanyDao.Properties.CompanyName.eq("Tencent"))
.unique();
companyDao.delete(companyTencent);    

deleteAll()

若需刪除表中所有實(shí)體蹄衷,則調(diào)用此方法忧额。舉例:刪除所有雇員。

employeeDao.deleteAll();

更新

若需對(duì)某個(gè)已存入數(shù)據(jù)庫(kù)實(shí)體的屬性進(jìn)行修改愧口,則需進(jìn)行update操作睦番。舉例:修改Netease公司中薪水小于等于13000人的名字

//查詢Company表中名為Netease的公司
Company companyNetease = companyDao.queryBuilder()
.where(CompanyDao.Properties.CompanyName.eq("Netease"))
.unique();
if (companyNetease != null) {
    //查詢Employee表中查詢Employee表中屬于Netease公司且薪水小于等于13000人的Employee
    List<Employee> employeeList = employeeDao.queryBuilder()
    .where(EmployeeDao.Properties.CompanyId.eq(companyNetease.getId()), 
    EmployeeDao.Properties.Salary.le(13000))
    .list();
    if (employeeList != null) {
        for (Employee employee : employeeList) {
            //修改屬性
            employee.setEmployeeName("baozi");
            //進(jìn)行更新
            employeeDao.update(employee);
        }
    } else {
        Log.e("greendao_test", "update:updateList為空");
    }
} else {
    Log.e("greendao_test", "update:company為空");
}

總結(jié)

到此,這一篇關(guān)于GreenDao3.0的使用就講解完畢了耍属,可結(jié)合上一篇集成與注解詳解一起看托嚣。

技術(shù)渣一枚,有寫的不對(duì)的地方歡迎大神們留言指正厚骗,有什么疑惑或者不懂的地方也可以在我Github上GreenDaoDemo項(xiàng)目的Issues中提出示启,我會(huì)及時(shí)解答。

附上GreenDaoDemo的地址:
GreenDaoDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末领舰,一起剝皮案震驚了整個(gè)濱河市夫嗓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冲秽,老刑警劉巖舍咖,帶你破解...
    沈念sama閱讀 223,207評(píng)論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異锉桑,居然都是意外死亡排霉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門民轴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攻柠,“玉大人,你說我怎么就攤上這事后裸」迮ィ” “怎么了?”我有些...
    開封第一講書人閱讀 170,031評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵轻抱,是天一觀的道長(zhǎng)飞涂。 經(jīng)常有香客問我,道長(zhǎng)祈搜,這世上最難降的妖魔是什么较店? 我笑而不...
    開封第一講書人閱讀 60,334評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮容燕,結(jié)果婚禮上梁呈,老公的妹妹穿的比我還像新娘。我一直安慰自己蘸秘,他們只是感情好官卡,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,322評(píng)論 6 398
  • 文/花漫 我一把揭開白布蝗茁。 她就那樣靜靜地躺著,像睡著了一般寻咒。 火紅的嫁衣襯著肌膚如雪哮翘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,895評(píng)論 1 314
  • 那天毛秘,我揣著相機(jī)與錄音饭寺,去河邊找鬼。 笑死叫挟,一個(gè)胖子當(dāng)著我的面吹牛貌虾,可吹牛的內(nèi)容都是我干的袖肥。 我是一名探鬼主播弛槐,決...
    沈念sama閱讀 41,300評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼橙困,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了奋献?” 一聲冷哼從身側(cè)響起健霹,我...
    開封第一講書人閱讀 40,264評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秽荞,沒想到半個(gè)月后骤公,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,784評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扬跋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,870評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凌节。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钦听。...
    茶點(diǎn)故事閱讀 40,989評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖倍奢,靈堂內(nèi)的尸體忽然破棺而出朴上,到底是詐尸還是另有隱情,我是刑警寧澤卒煞,帶...
    沈念sama閱讀 36,649評(píng)論 5 351
  • 正文 年R本政府宣布痪宰,位于F島的核電站,受9級(jí)特大地震影響畔裕,放射性物質(zhì)發(fā)生泄漏衣撬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,331評(píng)論 3 336
  • 文/蒙蒙 一扮饶、第九天 我趴在偏房一處隱蔽的房頂上張望具练。 院中可真熱鬧,春花似錦甜无、人聲如沸扛点。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陵究。三九已至眠饮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铜邮,已是汗流浹背仪召。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評(píng)論 1 275
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牲距,地道東北人返咱。 一個(gè)月前我還...
    沈念sama閱讀 49,452評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像牍鞠,于是被迫代替她去往敵國(guó)和親咖摹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,995評(píng)論 2 361

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