GreenDao的使用

一个将对象映射到 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 entities)
void    insertInTx(java.lang.Iterable entities, boolean setPrimaryKey)
long    insertWithoutSettingPk(T entity)  // 插入指定实体,无主键
long    insertOrReplace(T entity)  // 插入或替换指定实体
void    insertOrReplaceInTx(T... entities)
void    insertOrReplaceInTx(java.lang.Iterable entities)
void    insertOrReplaceInTx(java.lang.Iterable entities, boolean setPrimaryKey)
void    save(T entity)  // 依赖指定的主键插入或修改实体
void    saveInTx(T... entities)
void    saveInTx(java.lang.Iterable entities)

Dao删除

void    deleteAll()  // 删除所有
void    delete(T entity)  // 删除指定的实体
void    deleteInTx(T... entities)
void    deleteInTx(java.lang.Iterable entities)
void    deleteByKey(K key)  // 删除指定主键对应的实体
void    deleteByKeyInTx(K... keys)
void    deleteByKeyInTx(java.lang.Iterable keys)

Dao 修改

void    update(T entity)
void    updateInTx(T... entities)
void    updateInTx(java.lang.Iterable 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     where(WhereCondition cond, WhereCondition... condMore)  // 条件,AND 连接
QueryBuilder     whereOr(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore)  // 条件,OR 连接
QueryBuilder     distinct()  // 去重,例如使用联合查询时
QueryBuilder     limit(int limit)  // 限制返回数
QueryBuilder     offset(int offset)  // 偏移结果起始位,配合limit(int)使用
QueryBuilder     orderAsc(Property... properties)  // 排序,升序
QueryBuilder     orderDesc(Property... properties)  // 排序,降序
QueryBuilder     orderCustom(Property property, java.lang.String customOrderForProperty)  // 排序,自定义
QueryBuilder     orderRaw(java.lang.String rawOrder)  // 排序,SQL 语句
QueryBuilder     preferLocalizedStringOrder()  // 本地化字符串排序,用于加密数据库无效
QueryBuilder     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    build()
CursorQuery     buildCursor()
CountQuery   buildCount()
DeleteQuery  buildDelete()
 
// Query
// 设置查询参数,从 0 开始
Query    setParameter(int index, java.lang.Object parameter)
Query    setParameter(int index, java.lang.Boolean parameter)
Query    setParameter(int index, java.util.Date parameter)
void    setLimit(int limit)  // 限制返回数
void    setOffset(int offset)  // 偏移结果起始位,配合limit(int)使用
 
// Query 绑定线程,执行非本线程的 Query 抛异常,调用获取本线程 Query
Query    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   queryRaw(java.lang.String where, java.lang.String... selectionArg)
Query    queryRawCreate(java.lang.String where, java.lang.Object... selectionArg)
Query    queryRawCreateListArgs(java.lang.String where, java.util.Collection 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)

DeleteQuery 删除查询

DeleteQuery   buildDelete()  // QueryBuilder

查询日志

QueryBuilder.LOG_SQL = true;
QueryBuilder.LOG_VALUES = true;

你可能感兴趣的:(GreenDao的使用)