Android ORM框架GreenDao用法

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不能直接轉化數據庫實體類,好處就是建表的時候更加明顯,註解就比較隨意,像依賴關係,外鍵等,使用註解就不明顯

5 轉載請註明來自梧桐那時雨的博客:http://blog.csdn.net/fuchaosz/article/details/50225287

發佈了34 篇原創文章 · 獲贊 338 · 訪問量 90萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章