Android持久化存储(4)greenDAO的使用
1.背景
在上篇博客介紹SQLite的使用我們能感覺到,雖然Android已經簡化了一些SQLite的操作,提供了較為方便的API,但使用中還是需要開發者寫一些SQL語言,簡單而不簡約,有時候只想存儲一些簡單數據,卻需要花費很大力氣去開發接口,當然你可以說讓另一個程序員去開發數據庫操作接口不就行了嗎,你老板肯定不同意,這么簡單的活還要找別人,本來招你就是想一個人當兩個人用,你還奢望一份工作兩個人干?!如果你為這個事發愁,那趕緊來看看今天要介紹的greenDAO。
2.什么是GreenDAO
greenDAO官網關于greenDAO的介紹直擊開發者痛點—擺脫編寫SQL的泥沼!如果覺得這個slogan還不是很清楚,可以看一下詳細的介紹:
greenDAO是一個開放源代碼的Android ORM,令開發SQLite數據庫變得更有趣。它使開發人員免于陷入處理低級數據庫泥沼,節省了開發時間。 SQLite是一個很棒的嵌入式關系數據庫,然而編寫SQL和解析查詢結果仍然是非常繁瑣且耗時的任務。通過將Java對象映射到數據庫表(稱為ORM,“對象/關系映射”),greenDAO使您擺脫這些麻煩。這樣,您可以使用簡單的面向對象的API來存儲,更新,刪除和查詢Java對象。
greenDAO具有如下優勢
- 高性能,可能是最快的Android ORM(雖然有可能違法廣告法,但確實療效不錯);
- 易于使用的強大API;
- 內存消耗小;
- 庫體積小;(<100KB);
- 支持數據庫加密:greenDAO支持SQLCipher,以確保用戶數據的安全
greenDAO如何做到簡化數據庫操作呢?因為使用了ORM,即對象關系映射(Object Relational Mapping),對象指業務實體對象(這里指java對象),關系指關系型數據庫,通過將關系型數據庫和業務實體對象之間作一個映射,開發人員只和對象打交道,不用面對繁瑣的SQL語言,對象到數據庫的映射由中間件幫忙映射,greenDAO正是扮演這樣的角色。
3.greenDAO的使用
3.1 工程中添加greenDAO
greenDAO如此方便,那么在哪里下載到呢?又如何添加到工程中呢?在工程中配置很簡單,只需要配置兩個build.gradle文件,首先是工程根目錄下的build.gradle,第一步是在倉庫repositories里添加mavenCentral,因為greenDAO放在Maven Central上,第二步是在依賴dependencies中添加greenDAO,請注意使用最新版本,可在這個網址查詢版本號。
第二個要修改的build.gradle是應用目錄下的app/build.gradle,首先是聲明使用greenDAO,其次是配置greenDAO選項,最后在依賴中添加greenDAO。
apply plugin: 'com.android.application' apply plugin: 'org.greenrobot.greendao' android { ... } //在這里設置greenDAO的配置選項 greendao {schemaVersion 2daoPackage "com.test.greendaodemo" }//build.gradle里的依賴模塊 dependencies {implementation 'org.greenrobot:greendao:3.2.2' }其中,greenDAO里配置支持多個屬性配置,分別如下:
- schemaVersion: 數據庫的當前版本。如果更改實體/數據庫架構,則必須增加該值,如果不配置該選項,則數據庫版本默認為1;
- daoPackage: 生成的DAO,DaoMaster和DaoSession的程序包名稱。默認為實體所在的程序包名;
- targetGenDir: 生成代碼的存儲位置。 默認是build目錄下(build / generated / source / greendao);
- generateTests: 設置成true以自動生成單元測試;
- targetGenDirTests: 生成的單元測試存儲目錄。默認為src / androidTest/java。
配置完兩處gradle之后,程序中便可以開始使用greenDAO了。
3.2 創建實體類
例如我們創建一個Book的實體類,這一步類似于創建數據庫的表,只不過這里操作的是對象。Book實體類的代碼如下,這個實體類就是一般的java代碼,還不能和數據庫進行映射,為了用上greenDAO,還需要對這個實體類進行注解,或者說打上標記,實現很簡單,在class上使用@Entity即可,這樣就變成greenDAO可識別的實體類(沒看過greenDAO源代碼,猜測greenDAO會掃描所有代碼文件,發現了這個標記識別成要映射的實體類)。
我們在創建數據庫的表時,對每一列的要求可能不一樣,例如想把某一列設置成自增長,某一列值不能為空等,實體類是不是也可以這么設置呢,答案是可以,想設置哪個變量(或者說是哪一列,因為實體類中的變量會轉換成數據庫的列名),在該變量聲明上打上標記就像,例如想設置id為自增長主鍵,那就在id之上添加@Id(autoincrement = true)(注意,greenDAO要求主鍵必須是long類型),要設置ISBN為非空列,那就添加注解@NotNull,或者想把某個變量排除在外,不寫入數據表,那就添加注解@Transient。Book實體類完整示例如下
package com.test.greendaodemo;import org.greenrobot.greendao.annotation.Entity; import org.greenrobot.greendao.annotation.Id; import org.greenrobot.greendao.annotation.NotNull; import org.greenrobot.greendao.annotation.Transient; import org.greenrobot.greendao.annotation.Generated;@Entity public class Book {@Id(autoincrement = true)private long id;private String name;//書名@NotNullprivate long ISBN;//國際標準書號private String author;//作者private float price;//價格@Transientprivate String press;//出版社@Generated(hash = 1424927682)public Book(long id, String name, long ISBN, String author, float price) {this.id = id;this.name = name;this.ISBN = ISBN;this.author = author;this.price = price;}@Generated(hash = 1839243756)public Book() {}//getter setterpublic long getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public long getISBN() {return ISBN;}public void setISBN(long ISBN) {this.ISBN = ISBN;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public float getPrice() {return price;}public void setPrice(float price) {this.price = price;}public String getPress() {return press;}public void setPress(String press) {this.press = press;}public void setId(long id) {this.id = id;} }實體類設置完之后,點擊make project,greenDAO便根據這個實體類自動生成BookDao,DaoMaster和DaoSession三個文件,因為沒在app/build.gradle里設置greendao的targetGenDir,因此生成的三個文件路徑放在默認路徑build/source/greendao下。如果想放置到java代碼目錄下,設置targetGenDir成指定目錄即可。個人建議使用默認地址,因為這是自動生成的代碼,不需要開發者去修改,如果放在java目錄下,不了解greenDAO的開發人員誤認為是人工寫的代碼,反而可能去修改其中的代碼導致出錯。
雖然是自動生成的代碼,但還是需要了解一下生成的這個代碼文件是做啥的。
- DaoMaster:點擊打開DaoMaster,可以看到代碼封裝了SQLiteDatabase和SQLiteOpenHelper(DatabaseOpenHelper繼承了SQLiteOpenHelper),這表示DaoMaster功能是創建和升級SQLite數據庫,也是使用greenDAO的入口;
- BookDAO:對于每個實體,greenDAO生成對應的DAO,因示例代碼只創建了Book實體,故只生成了BookDAO,一般是名字為xxx的實體,會生成的DAO是xxxDAO,DAOs里包括根據實體創建表的方法,讀取等方法;
- DaoSession:這個類管理所有可用DAO對象,例如示例中的BookDao,可通過使用getter方法獲取該對象。
這三個文件又有怎樣的關系呢,DaoMaster是入口,通過其獲得DaoSession,而DaoSession又管理著所有DAO,因此可以通過DaoSession獲得DAO對象,他們的關系圖如下圖所示,我們將會在實際使用的時候再理解一下他們的關系。
3.3 greenDAO初始化
創建一個application類,然后在application中完成DaoSession的初始化,這樣的好處是依托于Application單例模式,可避免以后重復初始化greenDAO,代碼如下,別忘了在AndroidManifest.xml里增加android:name=".MyApplication"。
package com.test.greendaodemo;import android.app.Application; import android.database.sqlite.SQLiteDatabase;public class MyApplication extends Application {private DaoMaster.DevOpenHelper mHelper;private SQLiteDatabase db;private DaoMaster mDaoMaster;private DaoSession mDaoSession;public static MyApplication instances;@Override public void onCreate() {super.onCreate();instances = this;setDatabase();}public static MyApplication getInstances(){return instances;}/*** 設置greenDao*/private void setDatabase() {// 通過 DaoMaster的內部類DevOpenHelper可獲得SQLiteOpenHelper對象。mHelper = new DaoMaster.DevOpenHelper(this, "greenDAOdemo_db", null);db = mHelper.getWritableDatabase();mDaoMaster = new DaoMaster(db);mDaoSession = mDaoMaster.newSession();}public DaoSession getDaoSession() {return mDaoSession;}public SQLiteDatabase getDb() {return db;} }3.4 使用greenDAO實現增刪改查
實現增刪改查需要獲取DAO對象,如何取得DAO對象呢?回憶一下上邊提到的greenDAO生成的三個文件關系圖,還有印象的話,可知道獲取DAO對象需要通過DaoSession,而獲取DaoSession又是通過DaoMaster。有了DAO對象,可很方便的實現增刪改查,基本上只需要實例化Book對象,配置Book對象各個屬性的值,再使用BookDao對應的增刪改查方法就能簡單快速執行對應的操作,示例代碼如下,從示例代碼可以看到,增刪改查全程沒見到煩人的SQL語句,因為greenDAO替我們去生成和執行對應的SQL語句了。
BookDao mbookdao = MyApplication.getInstances().getDaoSession().getBookDao();//增book = new Book();book.setId((long)2);book.setName("三體");book.setISBN((long)89327455);book.setAuthor("劉慈欣");book.setPrice((float)50.00);book.setPress("重慶出版社");mbookdao.insert(book);//刪mbookdao.deleteByKey((long)1);//改book.setPrice((float)30.00);mbookdao.update(book);//查List<Book> booklist = mbookdao.loadAll();String bookname = "";StringBuilder stringBuilder=new StringBuilder();for (int i = 0; i < booklist.size(); i++) {bookname += booklist.get(i).getName()+",";stringBuilder.append(booklist.get(i).getId()+"\n");stringBuilder.append(booklist.get(i).getName()+"\n");stringBuilder.append(booklist.get(i).getAuthor()+"\n");stringBuilder.append(booklist.get(i).getISBN()+"\n");stringBuilder.append(booklist.get(i).getPress()+"\n");}4.總結
greenDAO通過ORM方案,將實體類和數據庫映射,避免程序員直接面對SQL語言,大大簡化了SQLite數據庫開發流程,如果只是簡單的數據庫存儲操作,大可借助greenDAO來開發,因為greenDAO使用簡單,配置簡單,占用內存小,處理速度快,而且還是開源的,有好的輪子先用著吧,先把老板安排的工作做好,待到實力大增還有時間,再想辦法自己造輪子或者優化輪子,這是后話了。
總結
以上是生活随笔為你收集整理的Android持久化存储(4)greenDAO的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android持久化存储(3)SQLit
- 下一篇: android sina oauth2.