背景
通過Android資料庫——SQLite 可以看出盡管Android已經為我們提供了sqlite資料庫核心,但我們要想操作資料庫還需要自己拼sql,在大量的增删改查中拼sql這種操作顯然是大大降低了我們的工作效率,是以Android的 orm(Object/Relational Mapping) 架構應運而生。大概在15、16年前後出現了大量的這種架構,而選擇greendao的夥伴們大概都是因下面這張圖:
那時候還是greendao2.0的時代,aop 還沒那麼普遍(額,現在不用aop都不敢稱為架構了),greendao的內建方式相對其他架構而言算是比較複雜的。但為了更好的使用者體驗,我們偉大的Android開發工程師還是選擇了它。
GreenDao 2.0內建
上面說它內建有些複雜,我們來看看是要如何內建
-
建立一個java項目
為了操作友善,最好和目前的Android項目在同一個project下
- 在java項目中添加greendao的依賴
- 在java項目的main方法中完成以下操作
執行該main方法,則會在Android項目的com.fcat.cloud.bean的目錄下生成UserInfo類,裡面包含了上面生成的字段及字段的get、set方法。在com.fcat.cloud.dao下面生成DaoMaster、DaoSession、UserInfoDao三個類,如果這些代碼都成功生成,說明內建成功。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'); }
GreenDao 3.0內建
從上面我們了解到要使用GreenDao2.0需要建立個java項目,而這個java項目的工作就是自動生成代碼。早期很多orm架構都是用注解+反射來實作這個步驟的,而反射的性能是比較低的。GreenDao的java項目正是解決了這個低效問題,但作為開發者來說,我們并不想維護這個java項目,而GreenDao 3.0中使用aop技術幫我們解決了這個問題。
- 在項目中添加GreenDao 3.0的依賴
implementation 'org.greenrobot:greendao:3.1.0' implementation 'org.greenrobot:greendao-generator:3.1.0'
-
在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' }
- 編輯要存入資料庫的類
OK,這樣就可以了。GreenDao 3.0 的內建跟其他orm的架構還是很相似的。// 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; }
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的前景,我并不看好,主要來自于兩個方面
- 就目前而言,greendao還不支援kotlin,而且谷歌的 jetpack 也包含了資料庫操作的元件 Room,Room是支援kotlin的。
-
出現可速度更快,使用更簡單的資料引擎,objectbox,在greendao官網上也是推薦使用objectbox:
for new apps we recommend ObjectBox, a new object-oriented database that is much faster than SQLite and easier to use.