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<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;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • greenDao的介绍 greenDao是Android数据库ORM(object/relational mapp...
    K线中有财富密码阅读 1,762评论 0 2
  • 最近一段时间,由于项目需要进行优化,项目中的数据缓存可以说是很混乱,有SqlLite,ActiviteAndroi...
    加油码农阅读 1,183评论 1 0
  • GreenDao 介绍:greenDAO是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操...
    小董666阅读 726评论 0 1
  • 一、关于greenDAO greenDAO应该算是当前最火的数据库开源框架了,它是一个将对象映射到SQLite数据...
    当幸福来敲门58阅读 13,842评论 3 19
  • 以前开发用到数据库时,基本上都是用android原生的sql语句,写那些语句时稍有不慎,就给你抛出一个except...
    BlainPeng阅读 7,664评论 2 12