天天看點

Android資料庫——GreenDao使用

背景

通過Android資料庫——SQLite 可以看出盡管Android已經為我們提供了sqlite資料庫核心,但我們要想操作資料庫還需要自己拼sql,在大量的增删改查中拼sql這種操作顯然是大大降低了我們的工作效率,是以Android的 orm(Object/Relational Mapping) 架構應運而生。大概在15、16年前後出現了大量的這種架構,而選擇greendao的夥伴們大概都是因下面這張圖:

Android資料庫——GreenDao使用

那時候還是greendao2.0的時代,aop 還沒那麼普遍(額,現在不用aop都不敢稱為架構了),greendao的內建方式相對其他架構而言算是比較複雜的。但為了更好的使用者體驗,我們偉大的Android開發工程師還是選擇了它。

GreenDao 2.0內建

上面說它內建有些複雜,我們來看看是要如何內建

  1. 建立一個java項目

    為了操作友善,最好和目前的Android項目在同一個project下

  2. 在java項目中添加greendao的依賴
  3. 在java項目的main方法中完成以下操作
    public static void main(String[] arg) {
    	// 7 為資料庫版本号
    	// "com.fcat.cloud.bean" 為Android項目中bean存放目錄,greendao會自動在該目錄下生産bean
    	Schema schema = new Schema(7, "com.fcat.cloud.bean");
    	//dao生成的目錄
    	schema.setDefaultJavaPackageDao("com.fcat.cloud.dao");
    	//添加要存放的實體類
    	Entity user = schema.addEntity("UserInfo");
    	//該實體存放的表的名稱
    	user.setTableName("userTable");
    	//表中的字段(類的屬性)
    	user.addStringProperty("nickName");
    	user.addIntProperty("sex");
    	user.addStringProperty("birthday");
    	//添加userName,并将其設定為主鍵
    	user.addStringProperty("userName").primaryKey();
    	// /aaa/bbb 為Android項目所在目錄
    	new DaoGenerator().generateAll(schema, '/aaa/bbb'); 
    }
               
    執行該main方法,則會在Android項目的com.fcat.cloud.bean的目錄下生成UserInfo類,裡面包含了上面生成的字段及字段的get、set方法。在com.fcat.cloud.dao下面生成DaoMaster、DaoSession、UserInfoDao三個類,如果這些代碼都成功生成,說明內建成功。

GreenDao 3.0內建

從上面我們了解到要使用GreenDao2.0需要建立個java項目,而這個java項目的工作就是自動生成代碼。早期很多orm架構都是用注解+反射來實作這個步驟的,而反射的性能是比較低的。GreenDao的java項目正是解決了這個低效問題,但作為開發者來說,我們并不想維護這個java項目,而GreenDao 3.0中使用aop技術幫我們解決了這個問題。

  1. 在項目中添加GreenDao 3.0的依賴
    implementation 'org.greenrobot:greendao:3.1.0'
    implementation 'org.greenrobot:greendao-generator:3.1.0'
               
  2. 在gradle中配置版本資訊

    在project的gradle中添加 在app的gradle中添加

    apply plugin: 'org.greenrobot.greendao'
    greendao {
        // 資料庫schema版本号
        schemaVersion 3
        // 生成的dao的包名
        daoPackage 'com.fcat.cloud.dao'
        // 生成的dao的存放路徑
        targetGenDir 'src/main/java'
    }
               
  3. 編輯要存入資料庫的類
    // GreenDao會根據@Entity注解來生成對應的資料表,表名預設為類名,可以使用nameInDb進行更改
    @Entity(nameInDb = "userTable")
    public class UserInfo{
    	// 自動生成自增長id
    	@Id(autoincrement = true)
    	public Long id;
    	public String userName;
    	public String nickName;
    	public int sex;
    	public String birthday;
    	// @Transient修飾的字段不會添加到資料表中
    	@Transient
    	public String tag;
    }
               
    OK,這樣就可以了。GreenDao 3.0 的內建跟其他orm的架構還是很相似的。

GreenDao使用

GreenDao在使用上2.0和3.0還是保持一緻的。資料的增删改查都是通過dao來執行,dao則是通過daoSession來擷取,整體調用鍊是:

DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, "cloud", null);
SQLiteDatabase db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
UserInfoDao userinfoDao = daoSession.getUserInfoDao()
           

拿到dao之後,我們就可以直接調用裡面的insert、update、delete等方法。

GreenDao前景

關于greendao的前景,我并不看好,主要來自于兩個方面

  1. 就目前而言,greendao還不支援kotlin,而且谷歌的 jetpack 也包含了資料庫操作的元件 Room,Room是支援kotlin的。
  2. 出現可速度更快,使用更簡單的資料引擎,objectbox,在greendao官網上也是推薦使用objectbox:

    for new apps we recommend ObjectBox, a new object-oriented database that is much faster than SQLite and easier to use.