GreenDao3.0學習(一)

本文主要是greendao3.0的快速配置

一.什麼是greendao

GreenDao是一個用於Android開發的對象/關係映射(ORM)工具。它向SQLite數據庫提供了一個對象導向的接口。主要是將對象映射到SQLite數據庫中,GreenDao3.0是greendao的一個新的版本,相對於greendao2.x有更加快捷的配置方式,java

二.greendao的特色:

  1. 性能最大化(對於Android來講,多是最快的ORM)
  2. 簡單易用API
  3. 對Android高度優化
  4. 最小的內存開銷
  5. 較小的文件體積
  6. 等等

三.greendao的優勢與缺點

優勢:性能最大化、內存開銷最小化、對Android高度優化、操做方便、文件體積比較小
缺點:學習成本大、須要遵循一些規則android

greendao官網:
http://greenrobot.org/greendao/
github上的greendao:
https://github.com/greenrobot...git

greenDAO結構圖

greendao3.0配置

前面介紹了這麼多,可是好像和本文沒有太大的關係,好了,如今咱們就開始一步一步的進行greendao3.0的配置。
因爲我是使用的android studio開發,因此主要也是按照在android studio中進行配置,github

第一步:

build.gradle中加入apply plugin: 'org.greenrobot.greendao'
以下圖sql

第二步:

build.gradle中加入數據庫

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
    }
}

以下圖:app

第三步:

build.gradle中加入maven

compile 'org.greenrobot:greendao:3.0.1'
compile 'org.greenrobot:greendao-generator:3.0.0'

以下圖:ide

第四步:

build.gradle中加入工具

greendao {
    schemaVersion 1
    daoPackage 'baochen.greendao.dao.gen'
    targetGenDir 'src/main/java'
}

以下圖:


這裏須要作一下說明:
schemaVersion : 表示的數據庫schema的版本號:在升級數據庫或者數據遷移的時候須要改變這個值,只要每次都+1就行;
daoPackage : dao的包名,包名默認是entity所在的包;
targetGenDir : 自動生成的數據庫文件的目錄。

若是上面不指定目錄的話,數據庫文件就會生成到build/generated/source/greendao下面,還須要拷貝到本身的目錄中,因此這裏仍是指定生成目錄爲好。

第五步:

在項目中新建一個實體類(如UserBean.java),並加入以下代碼:

@Entity
public class UserBean {
    @Id
    private Long id;
    private String name;
}

第六步:

點擊bulid下的make project


這時咱們會看到UserBean 這個類中自動生成了許多東西,

@Entity
public class UserBean {
    @Id
    private Long id;
    private String name;
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Long getId() {
        return this.id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    @Generated(hash = 2024802960)
    public UserBean(Long id, String name) {
        this.id = id;
        this.name = name;
    }
    @Generated(hash = 1203313951)
    public UserBean() {
    }

}

同時:在咱們剛剛配置的greendao自動生成dao的目錄下,生成了以下三個文件:
DaoMaster.java/DaoSession.java/UserBeanDao.java


其中DaoMaster.java/DaoSession.java都是greendao生成的管理數據庫的類。好比DaoMaster.java中就會生成數據庫schema的版本號:(就是咱們剛剛在build.gradle中設置的版本號:)

public static final int SCHEMA_VERSION = 1;


而自動生成的UserBeanDao.java就是更具咱們設置的UserBean生成的,(爲何會生成這個類呢,在下一節中仔細說明)
在UserBeanDao.java這個類中,咱們能夠看到,生成了一張名爲USER_BEAN的數據表,也是說,只要咱們配置好greendao3.0的相關東西,咱們不需本身去生寫成數據表的sql語句,能夠認爲UserBeanDao.java就是一張數據表,UserBeanDao.java的代碼以下:

/** 
 * DAO for table "USER_BEAN".
*/
public class UserBeanDao extends AbstractDao<UserBean, Long> {

    public static final String TABLENAME = "USER_BEAN";

    /**
     * Properties of entity UserBean.<br/>
     * Can be used for QueryBuilder and for referencing column names.
    */
    public static class Properties {
        public final static Property Id = new Property(0, Long.class, "id", true, "_id");
        public final static Property Name = new Property(1, String.class, "name", false, "NAME");
    };


    public UserBeanDao(DaoConfig config) {
        super(config);
    }
    
    public UserBeanDao(DaoConfig config, DaoSession daoSession) {
        super(config, daoSession);
    }

    /** Creates the underlying database table. */
    public static void createTable(Database db, boolean ifNotExists) {
        String constraint = ifNotExists? "IF NOT EXISTS ": "";
        db.execSQL("CREATE TABLE " + constraint + "\"USER_BEAN\" (" + //
                "\"_id\" INTEGER PRIMARY KEY ," + // 0: id
                "\"NAME\" TEXT);"); // 1: name
    }

    /** Drops the underlying database table. */
    public static void dropTable(Database db, boolean ifExists) {
        String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"USER_BEAN\"";
        db.execSQL(sql);
    }

    @Override
    protected final void bindValues(DatabaseStatement stmt, UserBean entity) {
        stmt.clearBindings();
 
        Long id = entity.getId();
        if (id != null) {
            stmt.bindLong(1, id);
        }
 
        String name = entity.getName();
        if (name != null) {
            stmt.bindString(2, name);
        }
    }

    @Override
    protected final void bindValues(SQLiteStatement stmt, UserBean entity) {
        stmt.clearBindings();
 
        Long id = entity.getId();
        if (id != null) {
            stmt.bindLong(1, id);
        }
 
        String name = entity.getName();
        if (name != null) {
            stmt.bindString(2, name);
        }
    }

    @Override
    public Long readKey(Cursor cursor, int offset) {
        return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0);
    }    

    @Override
    public UserBean readEntity(Cursor cursor, int offset) {
        UserBean entity = new UserBean( //
            cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id
            cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1) // name
        );
        return entity;
    }
     
    @Override
    public void readEntity(Cursor cursor, UserBean entity, int offset) {
        entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0));
        entity.setName(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1));
     }
    
    @Override
    protected final Long updateKeyAfterInsert(UserBean entity, long rowId) {
        entity.setId(rowId);
        return rowId;
    }
    
    @Override
    public Long getKey(UserBean entity) {
        if(entity != null) {
            return entity.getId();
        } else {
            return null;
        }
    }

    @Override
    protected final boolean isEntityUpdateable() {
        return true;
    }
    
}

到目前爲止,咱們對greendao3.0的配置基本上完成,雖然配置有點麻煩,可是對於咱們後面使用greendao對數據庫進行相關操做的時候,會發現很方便。
項目相關地址:https://github.com/mutounaodai/Greendao

相關文章
相關標籤/搜索