背景
通過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的依賴
compile 'de.greenrobot:greendao-generator:2.1.0'
- 在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中添加classpath 'org.greenrobot:greendao-gradle-plugin:3.1.0'
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.