Android ORM框架GreenDao用法
0 簡介
android 上的ORM框架主要有兩個:ormlite 和 GreenDAO,本篇主要介紹GreenDao的用法,原因是GreenDAO的速度快,關於ormlite和GreenDao的性能對比,請看這篇文章:[http://www.open-open.com/lib/view/open1438065400878.html][1]
GreenDao的Github地址: [https://github.com/greenrobot/greenDAO][2]
1 原理
GreenDAO之所以比ormlite快,是因爲ormlite採用註解和反射,greenDao採用預先生成好的Java類,一般用了反射速度就會慢,但是greenDao的缺點就是沒有ormlite易用,ormlite上手更快,更靈活。GreenDao實際上是用一些比封裝的比較完善的類,就像Android提供的OpenHelper一樣的,但是由於每個人的表結構都不一樣,所以這些類必須動態生成,但是我們無法寫出這些類,因此作者就創建了一個模板這個模板就是DaoGenerator,這是一個java工程,在使用之前必須先搭建這個工程,然後生成DaoMaster等類,然後就能大顯身手了。
總結一下,使用GreenDao分三步
- 創建Java工程Daogenerator
- 生成DaoMaster、DaoSession、表對應實體類
- 使用生成的類方便的操作數據庫
2 創建Java工程
(1) 在AndroidStudio中創建新的module,點擊Fiel–>new module–>選擇Java Libary
創建好的Java工程如下圖,包名和類名隨意命名,但類名不要寫DaoGenerator,因爲這是系統的類名
(2) 在Java工程的build.gradle文件中引入GreenDaoGenerator
compile 'de.greenrobot:greendao-generator:2.0.0'
博主的daogenerator工程的build.gradle文件如下:
(3) 編寫定製屬於我們的Dao文件生成器,在裏面定義我們的數據庫名稱,表結構,表的依賴關係,當然全都是面向對象的操作,不涉及到SQL語句,GreenDAO都幫我們封裝好了,在生成的具體文件中就會看見SQL語句,這裏主要參考這篇文章:http://my.oschina.net/cheneywangc/blog/196354
如果表的結構發生變化,即Dao文件的屬性發生變化,那麼必須修改Dao生成文件,然後重新生成相應的文件
本例中MyDaoGenerator的代碼如下:
/**
* GreenDao的實體類生成器
*/
public class MyDaoGenerator {
public static void main(String[] args) {
//指定數據庫版本號,以及自動生成代碼的包路徑
Schema schema = new Schema(1, "com.hello1.model");
//添加屬性
addNote(schema);
//設置自動生成的代碼的生成路徑
try {
new DaoGenerator().generateAll(schema, "./app/src/main/java");
} catch (Exception e) {
e.printStackTrace();
}
}
//添加數據庫實體類
public static void addNote(Schema schema) {
//一個實體類對於數據庫的一張表
Entity note = schema.addEntity("Note");
//接下來你便可以設置表中的字段,greenDAO 會自動根據實體類的屬性值來創建表字段,並賦予默認值
note.addIdProperty().autoincrement();
note.addStringProperty("text").notNull();
note.addShortProperty("content");
note.addDateProperty("date");
}
}
下面具體講解:
Schema schema = new Schema(1, “com.hello1.model”);
首先創建Schema,第一個參數是數據庫的版本號,第二個參數是指定生成的文件放在Android工程的哪個包下面,這裏”com.hello1.model”是我的Android工程app的包路徑,因爲最終這些生成的文件是要我們用在Android中的
關於網上說的必須要在Android工程中新建一個src-gen目錄,然後在build.gradle文件中配置source dir()的做法完全沒有必要
接着就要創建表結構了,一個Entity就是一個表,下面的代碼定義了建表的過程,雖然全部採用了面向對象的簡表過程,但還是還要一定的SQL基礎,否則從基本的表的結構,外鍵到用E-R圖設計表結構都是需要數據庫知識的,涉及到的多表查詢,一對一,一對多的關係更是複雜
Entity note = schema.addEntity(“Note”);
note.addIdProperty().autoincrement();
note.addStringProperty(“text”).notNull();
note.addShortProperty(“content”);
note.addDateProperty(“date”);
3 在Android工程中使用GreenDAO
(1) 運行我們創建的Java工程,本例中生成的結果如下:
(2) 在Android工程(本例中就是app)中的build.gradle文件引入下面代碼:
compile ‘de.greenrobot:greendao:2.0.0’
(3) MainActivity代碼如下,佈局文件只有2個按鈕
private DaoMaster.DevOpenHelper helper;
private SQLiteDatabase db;
private DaoMaster daoMaster;
private DaoSession daoSession;
private NoteDao noteDao;
private Button btnTest;
private Button btnTest2;
private TextView tvShow;
private long count = 0;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.btnTest = (Button) findViewById(R.id.btn_test);
this.btnTest2 = (Button) findViewById(R.id.btn_test_2);
this.tvShow = (TextView) findViewById(R.id.tv_show);
//創建數據庫
this.helper = new DaoMaster.DevOpenHelper(this, "test_db", null);
this.db = helper.getWritableDatabase();
this.daoMaster = new DaoMaster(db);
this.daoSession = daoMaster.newSession();
this.noteDao = daoSession.getNoteDao();
this.btnTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
count++;
Note note = new Note();
note.setContent((short) count);
note.setText("測試數據,id = " + count);
note.setDate(new Date());
//插入數據
noteDao.insert(note);
}
});
this.btnTest2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//取出所有數據
List data = noteDao.queryBuilder().list();
if (data == null) {
tvShow.setText("木有數據");
return;
}
StringBuilder builder = new StringBuilder();
for (int i = 0; i < data.size(); i++) {
Note note = (Note) data.get(i);
builder.append(String.format("%d %s %s\n",note.getId(),note.getText(),note.getDate().toString()));
}
tvShow.setText(builder.toString());
}
});
}
(3) 以dao結尾的類纔是操作數據庫的類,得到NoteDao之後,現在就可以開心的使用GreenDAO了,具體的查詢等方法可參考官方文檔:http://greendao-orm.com/documentation
4 總結
(1) GreenDAO比ormlite快,但是配置麻煩,還要額外的工程,而且每次創建表都很麻煩,沒有ormlite的註解來的快,尤其是自己寫JavaBean還要和Entity相互轉換一下,也就是已經寫好的JavaBean不能直接轉化數據庫實體類,好處就是建表的時候更加明顯,註解就比較隨意,像依賴關係,外鍵等,使用註解就不明顯