GreenDao是一個用於Android開發的對象/關係映射(ORM)工具。它向SQLite數據庫提供了一個對象導向的接口。主要是將對象映射到SQLite數據庫中,GreenDao3.0是greendao的一個新的版本,相對於greendao2.x有更加快捷的配置方式,java
優勢:性能最大化、內存開銷最小化、對Android高度優化、操做方便、文件體積比較小
缺點:學習成本大、須要遵循一些規則android
greendao官網:
http://greenrobot.org/greendao/
github上的greendao:
https://github.com/greenrobot...git
前面介紹了這麼多,可是好像和本文沒有太大的關係,好了,如今咱們就開始一步一步的進行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