一个将对象映射到 SQLite 数据库中的轻量且快速的ORM解决方案。针对Android被高度优化,greenDAO提供了极大的性能和消耗最少的内存。
**主页,文档和支持链接:
http://greenrobot.org/greendao/
greenDAO的独特的特性:
稳定:greenDAO一直围绕2011年以来,用于无数著名的应用
超级简单:简洁而直接的API,在V3与注解
小:library<150K,它只是简单的Java JAR(不依赖CPU本地部分)
快速:可能是最快的ORM为Android,采用智能代码生成驱动
安全和表现查询API:QueryBuilder的使用属性常量来避免错别字
强大的连接:查询整个实体,甚至加盟连锁为复杂的关系
灵活的物业类型:使用自定义类或枚举来代表你的实体数据
加密:支持SQLCipher加密的数据库
添加greenDAO到项目
配置项目的 build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
}
}
// 使用数据库升级辅助GreenDaoUpgradeHelper时添加
allprojects {
repositories {
...
maven {
url "https://jitpack.io"
}
}
}
配置模组的 build.gradle
apply plugin:
'org.greenrobot.greendao'dependencies {
compile 'org.greenrobot:greendao:3.2.0'
// 数据库加密时添加
compile 'net.zetetic:android-database-sqlcipher:3.5.1'
// 使用数据库升级辅GreenDaoUpgradeHelper时添加
compile 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v1.2.0'
}
设置 Schema,在模组的 build.gradle 中添加:
schemaVersion:数据库schema版本号,通过*OpenHelpers迁移数据,schema改变值增加。默认为1。
daoPackage:生成DAOs、DaoMaster、DaoSession的包名。默认为entities所在包名。
** targetGenDir**:生成DAOs、DaoMaster、DaoSession的目录。默认为build/generated/source/greendao generateTests: 设置true自动生成单元测试。 targetGenDirTests: 设置生成单元测试目录。默认为src/androidTest/java
greendao {
schemaVersion 1
daoPackage 'com.example.greendaodemo.dao'
targetGenDir 'src/main/java'}
混淆:
### greenDAO 3
-keepclassmembers class extends org.greenrobot.greendao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties
# If you do not use SQLCipher:
-dontwarn org.greenrobot.greendao.database.**
# If you do not use RxJava:
-dontwarn rx.**
基本用法
初始化
// Application 中执行
// DevOpenHelper 每次数据库升级会清空数据,一般用于开发
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
Database db = helper.getWritableDb();
DaoSession daoSession = new DaoMaster(db).newSession();
// 在使用的地方获取 DAO
NoteDao noteDao = daoSession.getNoteDao();
Dao 增加
long insert(T entity) // 插入指定实体
void insertInTx(T... entities)
void insertInTx(java.lang.Iterable<t> entities)
void insertInTx(java.lang.Iterable<t> entities, boolean setPrimaryKey)
long insertWithoutSettingPk(T entity) // 插入指定实体,无主键
long insertOrReplace(T entity) // 插入或替换指定实体
void insertOrReplaceInTx(T... entities)
void insertOrReplaceInTx(java.lang.Iterable<t> entities)
void insertOrReplaceInTx(java.lang.Iterable<t> entities, boolean setPrimaryKey)
void save(T entity) // 依赖指定的主键插入或修改实体
void saveInTx(T... entities)
void saveInTx(java.lang.Iterable<t> entities)
Dao删除
void deleteAll() // 删除所有
void delete(T entity) // 删除指定的实体
void deleteInTx(T... entities)
void deleteInTx(java.lang.Iterable<t> entities)
void deleteByKey(K key) // 删除指定主键对应的实体
void deleteByKeyInTx(K... keys)
void deleteByKeyInTx(java.lang.Iterable<k> keys)
Dao 修改
void update(T entity)
void updateInTx(T... entities)
void updateInTx(java.lang.Iterable<t> entities)
Dao 其它
void refresh(T entity) // 从数据库获取值刷新本地实体
long count() // 数量
boolean detach(T entity) // 从域中分离实体
void detachAll() // 从域中分离所有实体
AbstractDaoSession getSession()
Database getDatabase()
java.lang.String getTablename()
java.lang.String[] getAllColumns()
java.lang.String[] getPkColumns()
java.lang.String[] getNonPkColumns()
Property getPkProperty()
Property[] getProperties()
Dao 查询
loadAll()
T load(K key)
T loadByRowId(long rowId)
QueryBuilder 查询
List datas = userDao.queryBuilder() // 查询 User
.where(Properties.FirstName.eq("zl")) // 首名为 zl
.orderAsc(Properties.LastName) // 末名升序排列
.list(); // 返回集合
// Joe,>= 1970.10
QueryBuilder qb = userDao.queryBuilder();
qb.where(Properties.FirstName.eq("zl"),
qb.or(Properties.YearOfBirth.gt(1995),
qb.and(Properties.YearOfBirth.eq(1995), Properties.MonthOfBirth.ge(10))));
List youngJoes = qb.list();
queryBuilder() // Dao
// QueryBuilder
QueryBuilder<t> where(WhereCondition cond, WhereCondition... condMore) // 条件,AND 连接
QueryBuilder<t> whereOr(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore) // 条件,OR 连接
QueryBuilder<t> distinct() // 去重,例如使用联合查询时
QueryBuilder<t> limit(int limit) // 限制返回数
QueryBuilder<t> offset(int offset) // 偏移结果起始位,配合limit(int)使用
QueryBuilder<t> orderAsc(Property... properties) // 排序,升序
QueryBuilder<t> orderDesc(Property... properties) // 排序,降序
QueryBuilder<t> orderCustom(Property property, java.lang.String customOrderForProperty) // 排序,自定义
QueryBuilder<t> orderRaw(java.lang.String rawOrder) // 排序,SQL 语句
QueryBuilder<t> preferLocalizedStringOrder() // 本地化字符串排序,用于加密数据库无效
QueryBuilder<t> stringOrderCollation(java.lang.String stringOrderCollation) // 自定义字符串排序,默认不区分大小写
WhereCondition and(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore) // 条件,AND 连接
WhereCondition or(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore) // 条件,OR 连接
Query 重复查询
// zl,1995
Query query = userDao.queryBuilder().where(
Properties.FirstName.eq("zl"), Properties.YearOfBirth.eq(1995)
).build();
List joesOf1970 = query.list();
// Maria,1977
query.setParameter(0, "Maria");
query.setParameter(1, 1977);
List mariasOf1977 = query.list();
// QueryBuilder
Query<t> build()
CursorQuery buildCursor()
CountQuery<t> buildCount()
DeleteQuery<t> buildDelete()
// Query
// 设置查询参数,从 0 开始
Query<t> setParameter(int index, java.lang.Object parameter)
Query<t> setParameter(int index, java.lang.Boolean parameter)
Query<t> setParameter(int index, java.util.Date parameter)
void setLimit(int limit) // 限制返回数
void setOffset(int offset) // 偏移结果起始位,配合limit(int)使用
// Query 绑定线程,执行非本线程的 Query 抛异常,调用获取本线程 Query
Query<t> forCurrentThread() // 获取本线程 Query
获取查询结果
// QueryBuilder.where() 配合 WhereCondition.StringCondition() 实现SQL查询
Query query = userDao.queryBuilder()
.where(new WhereCondition.StringCondition("_ID IN (SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)"))
.build();
// Dao.queryRawCreate() 实现SQL查询
Query query = userDao.queryRawCreate( ", GROUP G WHERE G.NAME=? AND T.GROUP_ID=G._ID", "admin");
// Dao
java.util.List<t> queryRaw(java.lang.String where, java.lang.String... selectionArg)
Query<t> queryRawCreate(java.lang.String where, java.lang.Object... selectionArg)
Query<t> queryRawCreateListArgs(java.lang.String where, java.util.Collection<java.lang.object> selectionArg)
// WhereCondition.PropertyCondition
PropertyCondition(Property property, java.lang.String op)
PropertyCondition(Property property, java.lang.String op, java.lang.Object value)
PropertyCondition(Property property, java.lang.String op, java.lang.Object[] values)
// WhereCondition.StringCondition
StringCondition(java.lang.String string)
StringCondition(java.lang.String string, java.lang.Object value)
StringCondition(java.lang.String string, java.lang.Object... values)</java.lang.object>
DeleteQuery 删除查询
DeleteQuery buildDelete() // QueryBuilder
查询日志
QueryBuilder.LOG_SQL = true;
QueryBuilder.LOG_VALUES = true;