




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Android數(shù)據(jù)庫框架GreenDao輕量級(jí)的對(duì)象關(guān)系映射框架,永久告別sqlite對(duì)于我個(gè)人來說,我可能更加傾向于用GreenDao,所以今天也為大家?guī)砹薌reenDao的詳細(xì)博客,希望大家喜歡,之前也詳細(xì)介紹了ORM的思想,如果不明白可以先看一下前面的博文,這里就不多贅述了,我們新建一個(gè)工程傳說中的優(yōu)點(diǎn)最大性能(最快的 Android ORM)易于使用API高度優(yōu)化最小內(nèi)存消耗首先,我們查看Github上的集成步驟,先添加依賴 我們要添加 compile 'org.greenrobot:greendao:2.2.1'同時(shí)也要添加Java的項(xiàng)目包 compile '
2、;org.greenrobot:greendao-generator:2.2.0'緊接著,我們?cè)趍ain目錄下創(chuàng)建一個(gè)文件夾java-gen然后繼續(xù)在配置文件中添加/倉庫sourceSets main java.srcDirs = 'src/main/java','src/main/java-gen' 最后,新建一個(gè)Module,選擇Java Library,創(chuàng)建成功后,我們?cè)谒腷uild.gradle下添加compile 'org.greenrobot:greendao-generator:2.2.0'二.實(shí)體類到這里,我們的初步集成
3、算是完成了,是不是比較麻煩,我們看她說現(xiàn)在去看java-gen有生成代碼,實(shí)際上我們?nèi)タ床]有,因?yàn)槲覀冃枰狽oteDao.java,一個(gè)數(shù)據(jù)緩存對(duì)象,那我們需要怎么去做呢?我們直接在Module的類里寫了package com.example;import de.greenrobot.daogenerator.DaoGenerator;import de.greenrobot.daogenerator.Entity;import de.greenrobot.daogenerator.Schema;public class DaoMaker public static void main(St
4、ring args) /生成數(shù)據(jù)庫的實(shí)體類,還有版本號(hào) Schema schema = new Schema(1, "com.student.entity"); addStudent(schema); /指定dao schema.setDefaultJavaPackageDao("com.student.dao"); try /指定路徑 new DaoGenerator().generateAll(schema, "D:githubGreenDaoappsrcmainjava-gen"); catch (Exception e) e.
5、printStackTrace(); /* * 創(chuàng)建數(shù)據(jù)庫的表 * * param schema */ public static void addStudent(Schema schema) /創(chuàng)建數(shù)據(jù)庫的表 Entity entity = schema.addEntity("Student"); /主鍵 是int類型 entity.addIdProperty(); /名稱 entity.addStringProperty("name"); /年齡 entity.addIntProperty("age"); /地址 entity.a
6、ddStringProperty("address"); 寫完這個(gè)時(shí)候我們要注意了,我們不能直接去運(yùn)動(dòng)這個(gè)工程,我們要單獨(dú)編譯這個(gè)java類。也就是右鍵編譯的時(shí)間有點(diǎn)點(diǎn)長(zhǎng),我們耐心等待一下就好了,這個(gè)時(shí)候我們可以看到控制臺(tái)會(huì)打印相關(guān)的信息這個(gè)時(shí)候你再去看java-gen目錄,就會(huì)有東西了很nice,這算是前期基本已經(jīng)完工了,我們可以看他的原型圖三.核心類可以看到,GreenDao是有自己創(chuàng)建的類的,我們來看看是什么類DaoSession:會(huì)話層,操作具體dDao類,提供了基本的持久化操作方法,比如對(duì)實(shí)體對(duì)象的insert,load,update,refresh,delete
7、的一些操作XXDao:實(shí)際生成的Dao類,通常對(duì)應(yīng)具體的java類,greenDao為每一個(gè)實(shí)體類創(chuàng)建一個(gè)Dao,他提供了比DaoSession更為具體的付費(fèi),比如count,loadALL和inserlnTx,批量插入xxEntity:持久的實(shí)體對(duì)象,通常代表數(shù)據(jù)庫row標(biāo)準(zhǔn)的java屬性Schema:實(shí)例數(shù)據(jù)schema,通過schema的版本和缺省的java包調(diào)用構(gòu)造器四.封裝操作類OK,了解的差不多了,我們就來實(shí)戰(zhàn)操作一下吧!實(shí)戰(zhàn)的時(shí)候,我們不需要在主Activity中放太多的邏輯代碼,全部封裝在一個(gè)數(shù)據(jù)庫的操作類中其實(shí)是最好的,所以我們先新建一個(gè)類package com.lgl.gr
8、eendao;import android.content.Context;import com.student.dao.DaoMaster;import com.student.dao.DaoSession;import de.greenrobot.dao.query.QueryBuilder;/* * 數(shù)據(jù)庫操作類 * Created by LGL on 2016/7/2. */public class DaoManager /* * 實(shí)現(xiàn)功能 * 1.創(chuàng)建數(shù)據(jù)庫 * 2.創(chuàng)建數(shù)據(jù)庫的表 * 3.對(duì)數(shù)據(jù)庫的升級(jí) * 4.對(duì)數(shù)據(jù)庫的增刪查改 */ /TAG public static fin
9、al String TAG = DaoManager.class.getSimpleName(); /數(shù)據(jù)庫名稱 private static final String DB_NAME = "greendao.db" /多線程訪問 private volatile static DaoManager manager; /操作類 private static DaoMaster.DevOpenHelper helper; /上下文 private Context mContext; /核心類 private static DaoMaster daoMaster; privat
10、e DaoSession daoSession; /單例模式 public static DaoManager getInstance() DaoManager instance = null; if (manager = null) synchronized (DaoManager.class) if (instance = null) instance = new DaoManager(); manager = instance; return instance; /傳遞上下文 public void initManager(Context context) this.mContext =
11、 context; /* * 判斷是否存在數(shù)據(jù)庫,如果沒有則創(chuàng)建 * * return */ public DaoMaster getDaoMaster() if (daoMaster = null) helper = new DaoMaster.DevOpenHelper(mContext, DB_NAME, null); daoMaster = new DaoMaster(helper.getWritableDatabase(); return daoMaster; /* * 完成對(duì)數(shù)據(jù)庫的操作,只是個(gè)接口 * * return */ public DaoSession getDaoSes
12、sion() if (daoSession = null) if (daoMaster = null) daoMaster = getDaoMaster(); daoSession = daoMaster.newSession(); return daoSession; /* * 打開輸出日志,默認(rèn)關(guān)閉 */ public void setDebug() QueryBuilder.LOG_SQL = true; QueryBuilder.LOG_VALUES = true; /* * 關(guān)閉DaoSession */ public void closeDaoSession() if (daoSe
13、ssion != null) daoSession.clear(); daoSession = null; /* * 關(guān)閉Helper */ public void closeHelper() if (helper != null) helper.close(); helper = null; /* * 關(guān)閉所有的操作 */ public void closeConnection() closeHelper(); closeDaoSession(); 這個(gè)類能初始化數(shù)據(jù)庫的很多操作,不過這樣還不夠,我們需要再寫個(gè)實(shí)在點(diǎn)的操作類,現(xiàn)在只是單單實(shí)現(xiàn)一個(gè)插入的動(dòng)作package com.lgl.gr
14、eendao;import android.content.Context;import com.student.entity.Student;/* * 完成對(duì)某一張表的具體操作 * Created by LGL on 2016/7/2. */public class CommonUtils private DaoManager daoManager; /構(gòu)造方法 public CommonUtils(Context context) daoManager = DaoManager.getInstance(); daoManager.initManager(context); /* * 對(duì)數(shù)據(jù)
15、庫中student表的插入操作 * param student * return */ public boolean insertStudent(Student student) boolean flag = false; flag = daoManager.getDaoSession().insert(student) != -1 ? true : false; return flag; 五.插入OK,那我們先去看看sql的插入是怎么做的,定義一個(gè)button <Button android:id="+id/btn_add" android:layout_width
16、="match_parent" android:layout_height="wrap_content" android:text="添加數(shù)據(jù)" />我們只需要看他的點(diǎn)擊事件就可以了 case R.id.btn_add: dbUtils = new CommonUtils(this); Student student = new Student(); student.setName("lgl"); student.setAge(18); student.setAddress("北京");
17、dbUtils.insertStudent(student); break;我們一運(yùn)行之后,就可以在data/data/報(bào)名/databases中找到數(shù)據(jù)庫了這里感覺不好,ID應(yīng)該設(shè)置自動(dòng)增長(zhǎng)的對(duì)吧!其實(shí)只要不設(shè)置ID,他就會(huì)自增長(zhǎng)的六.批量插入插入可以了,我們批量插入就簡(jiǎn)單了,CommonUtils中增加與一個(gè)方法 /* * 批量插入 * * param students * return */ public boolean inserMultStudent(final List<Student> students) /標(biāo)識(shí) boolean flag = false; try /
18、插入操作耗時(shí) daoManager.getDaoSession().runInTx(new Runnable() Override public void run() for (Student student : students) daoManager.getDaoSession().insertOrReplace(student); ); flag = true; catch (Exception e) e.printStackTrace(); return flag; 我們可以去驗(yàn)證一下吧,那首先先去寫一個(gè)button吧 <Button android:id="+id/b
19、tn_add_mult" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="批量添加數(shù)據(jù)" />這樣,我們就可以直接看他的點(diǎn)擊事件了 case R.id.btn_add_mult: List<Student> list = new ArrayList<>(); for (int i = 0; i < 10; i+) Student studentlist = new
20、Student(); studentlist.setName("lgl" + i); studentlist.setAge(18 + i); studentlist.setAddress("北京" + i); list.add(studentlist); dbUtils.inserMultStudent(list); break;我們現(xiàn)在把數(shù)據(jù)庫導(dǎo)出來看看OK,這個(gè)非常的nice七.修改增刪查改嘛,增加說完了,我們來說修改,我們繼續(xù)寫修改的方法然后去驗(yàn)證,這樣對(duì)于讀者來說也是閱讀性比較好的 /* * 修改 * param student * return
21、 */ public boolean updateStudent(Student student) boolean flag = false; try daoManager.getDaoSession().update(student); flag = true; catch (Exception e) e.printStackTrace(); return flag; OK,我們?nèi)ヲ?yàn)證一下,寫個(gè)按鈕咯? <Button android:id="+id/btn_update" android:layout_width="match_parent"
22、android:layout_height="wrap_content" android:text="修改一條數(shù)據(jù)" />直接看點(diǎn)擊事件 case R.id.btn_update: Student studentupdate = new Student(); /根據(jù)ID來修改 studentupdate.setId(long) 1); /把年齡改成100歲 studentupdate.setAge(100); dbUtils.updateStudent(studentupdate); break;很好,很強(qiáng)勢(shì),我們導(dǎo)出數(shù)據(jù)庫,看看有沒有修改成100
23、歲現(xiàn)在我們可以看到修改了八.刪除刪除就比較簡(jiǎn)單了,我們直接寫/* * 刪除 * * param student * return */ public boolean deleteStudent(Student student) boolean flag = false; try /刪除指定ID daoManager.getDaoSession().delete(student); flag = true; catch (Exception e) e.printStackTrace(); return flag; 這樣就寫個(gè)按鈕 <Button android:id="+id/b
24、tn_delete" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="刪除一條數(shù)據(jù)" />OK,點(diǎn)擊事件是比較簡(jiǎn)單的 case R.id.btn_delete: Student studentdelete = new Student(); etId(long) 3); dbUtils.deleteStudent(studentdelete); break;我們要?jiǎng)h除的是他ID為3的數(shù)據(jù),那我們運(yùn)
25、行可以看到,ID為3的數(shù)據(jù)已經(jīng)不見了九.查詢OK,增刪查改我們只剩下查詢了,我們先來看一下怎么查詢一條語句,寫個(gè)方法 /* * 查詢單條 * * param key * return */ public Student listOneStudent(long key) return daoManager.getDaoSession().load(Student.class, key); 我們?cè)俣x一個(gè)button <Button android:id="+id/btn_load" android:layout_width="match_parent"
26、; android:layout_height="wrap_content" android:text="查詢一條數(shù)據(jù)" />這樣我們就可以去查詢了case R.id.btn_load: Log.i(TAG, dbUtils.listOneStudent(5) + ""); break;十.全部查詢?nèi)坎樵儽容^簡(jiǎn)單 /* * 全部查詢 * * return */ public List<Student> listAll() return daoManager.getDaoSession().loadAll(Stude
27、nt.class); 直接去調(diào)用就好了case R.id.btn_load_all: List<Student> lists = dbUtils.listAll(); Log.i(TAG, lists.toString(); break;十一.QueryBuilder作為最重要的查詢,GreenDao肯定是為我們做了很多事情,我們可以翻閱API找到QueryBuilder,這個(gè)復(fù)合查詢?cè)撛趺从媚??我們根?jù)條件來進(jìn)行邏輯查詢,原生的有,ORMLite也有,GreenDao也有,我就拿原生的和GreenDao來做對(duì)比 /* * 原生查詢 */ public void queryNati
28、ve() /查詢條件 String where = "where name like ? and _id > ?" /使用sql進(jìn)行查詢 List<Student> list = daoManager.getDaoSession().queryRaw(Student.class, where, new String"%l%", "6"); Log.i(TAG, list + ""); /* * QueryBuilder查詢大于 */ public void queryBuilder() /查詢構(gòu)建
29、器 QueryBuilder<Student> queryBuilder = daoManager.getDaoSession().queryBuilder(Student.class); /查詢年齡大于19的北京 List<Student> list = queryBuilder.where(StudentDao.Properties.Age.ge(19).where(StudentDao.Properties.Address.like("北京").list(); Log.i(TAG, list + ""); 不難看出,使用起來
30、是比較方便的,我們可以無限的加where條件查詢十二.完結(jié)增刪查改已經(jīng)基本上都講完了,那基本上這個(gè)框架也OK了,我們來看一下他運(yùn)行的截圖邏輯說的還算是比較詳細(xì)的,但是這個(gè)CommonUtils比較零散CommonUtilspackage com.lgl.greendao;import android.content.Context;import android.util.Log;import com.student.dao.StudentDao;import com.student.entity.Student;import java.util.List;import de.greenrobo
31、t.dao.query.QueryBuilder;/* * 完成對(duì)某一張表的具體操作 * Created by LGL on 2016/7/2. */public class CommonUtils /TAG private static final String TAG = CommonUtils.class.getSimpleName(); private DaoManager daoManager; /構(gòu)造方法 public CommonUtils(Context context) daoManager = DaoManager.getInstance(); daoManager.ini
32、tManager(context); /* * 對(duì)數(shù)據(jù)庫中student表的插入操作 * * param student * return */ public boolean insertStudent(Student student) boolean flag = false; flag = daoManager.getDaoSession().insert(student) != -1 ? true : false; return flag; /* * 批量插入 * * param students * return */ public boolean inserMultStudent(f
33、inal List<Student> students) /標(biāo)識(shí) boolean flag = false; try /插入操作耗時(shí) daoManager.getDaoSession().runInTx(new Runnable() Override public void run() for (Student student : students) daoManager.getDaoSession().insertOrReplace(student); ); flag = true; catch (Exception e) e.printStackTrace(); return flag; /* * 修改 * * param student * return */ public boolean updateStudent(Student student) boolean flag = false; try daoManager.getDaoSession().update(student); flag = true; catch (Exception e) e.printStackTrace(); return flag; /* * 刪除 * * param student * re
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)絡(luò)證券工具企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書
- 福建省福州市閩江口協(xié)作體2023-2024學(xué)年高三上學(xué)期11月期中聯(lián)考 英語答案
- 【7歷期末】安徽省合肥市2023-2024學(xué)年七年級(jí)下學(xué)期6月期末歷史試題(含解析)
- 2025年中國(guó)香薰蠟燭行業(yè)市場(chǎng)現(xiàn)狀調(diào)研及十三五盈利空間預(yù)測(cè)報(bào)告
- DB62T 4240-2020 油菜品種 冬油1號(hào)
- DB62T 4228-2020 灌區(qū)啤酒大麥寬幅勻播栽培技術(shù)規(guī)程
- 桑植縣2024-06號(hào)地塊第一階段土壤污染狀況調(diào)查報(bào)告
- 部編版一年級(jí)語文下冊(cè)第八單元教學(xué)反思
- 《展開與折疊》第2課時(shí)參考教案
- 中國(guó)聚四氟乙烯墊片項(xiàng)目投資計(jì)劃書
- 小學(xué)生朗讀指導(dǎo)課件
- DB32-T 5079-2025 城鎮(zhèn)供水水表安裝及維護(hù)技術(shù)規(guī)程
- 種畜禽場(chǎng)管理制度類
- 雷雨劇本文件完整版電子書下載
- 外墻保溫施工考核試卷
- 除顫儀使用的試題及答案
- 儲(chǔ)料倉施工方案
- 風(fēng)機(jī)葉片故障診斷-深度研究
- 新版統(tǒng)編版七年級(jí)下冊(cè)道德與法治四單元課件 11.1 法不可違
- 燒烤店員工培訓(xùn)
- 2025年全球及中國(guó)智能艾灸服務(wù)機(jī)器人行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
評(píng)論
0/150
提交評(píng)論