GreenDao是一个用于Android开发的对象/关系映射(ORM)工具。它向SQLite数据库提供了一个对象导向的接口。主要是将对象映射到SQLite数据库中,GreenDao3.0是greendao的一个新的版本,相对于greendao2.x有更加快捷的配置方式,
优点:性能最大化、内存开销最小化、对Android高度优化、操作方便、文件体积比较小
缺点:学习成本大、需要遵循一些规则
greendao官网:
http://greenrobot.org/greendao/
github上的greendao:
https://github.com/greenrobot/greenDAO
前面介绍了这么多,但是好像和本文没有太大的关系,好了,现在我们就开始一步一步的进行greendao3.0的配置。
由于我是使用的android studio开发,所以主要也是按照在android studio中进行配置,
在build.gradle
中加入apply plugin: 'org.greenrobot.greendao'
如下图
在build.gradle
中加入
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
}
}
如下图:
在build.gradle
中加入
compile 'org.greenrobot:greendao:3.0.1'
compile 'org.greenrobot:greendao-generator:3.0.0'
如下图:
在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.
* 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