Greendao3.0release与7月6日发布,其中最主要的三大改变就是:1.换包名 2.实体注解 3.加密支持的优化

本文里面会遇到一些代码示例,就摘了官方文档和demo里的例子了,因为他们的例子已经写的很好了。

一、GreenDao3的配置

3.0相比2.0的配置较为方便,不用新建Module等一系列操作,可以直接在build.gradle里配置并新建实体用添加注解的方式生成

步骤1/2

build.gradle下添加这些配置(v7包下面的3个是greendao的)

buildscript {repositories {mavenCentral()}dependencies {classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'}
}apply plugin: 'org.greenrobot.greendao'dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])testCompile 'junit:junit:4.12'compile 'com.android.support:appcompat-v7:23.4.0'compile 'org.greenrobot:greendao:3.0.1'compile 'org.greenrobot:greendao-generator:3.0.0'compile 'net.zetetic:android-database-sqlcipher:3.5.2'
}greendao {targetGenDir 'src/main/java'daoPackage 'com.XXXX.dao.db'
}

步骤2/2

2.2版本是在maingen里使用addEntity,addProperty等方法,3.0只需要手动创建一个实体类加上注解即可(下面会详细说)

build项目,自动生成DaoMaster,Daosession,UserDao等文件,接下来就可以在代码中正常使用了。

二、实体注解

大部分的注解都能找到之前与2.0对应的语法

2.1常用注解

@Entity
public class User {@Id(autoincrement = true)private Long id;@Property(nameInDb = "USERNAME")private String name;@NotNullprivate int repos;@Transientprivate int tempUsageCount;...
}

其中

@Entity 用于标识这是一个需要Greendao帮我们生成代码的bean

@Id 标明主键,括号里可以指定是否自增 相当于2.2版本的

Entity entity = schema.addEntity("User");
entity.addLongProperty("id").primaryKey().autoincrement();

@Property 用于设置属性在数据库中的列名(默认不写就是保持一致)

@NotNull 非空

@Transient 标识这个字段是自定义的不会创建到数据库表里 相当于2.2版本的

schema.enableKeepSectionsByDefault();

会生成下列代码

// KEEP INCLUDES - put your custom includes here
// KEEP INCLUDES END// KEEP FIELDS - put your custom fields here
// KEEP FIELDS END// KEEP METHODS - put your custom methods here
// KEEP METHODS END

之前想自定义的属性和其getset方法需要写在注释中,现在这个注解就能代替作用

2.2实体类注解

@Entity(schema = "myschema",active = true,nameInDb = "AWESOME_USERS",indexes = {@Index(value = "name DESC", unique = true)},createInDb = false
)
public class User {...
}

其中

schema是一个项目中有多个schema时 标明要让这个dao属于哪个schema

active 是标明是否支持实体类之间update,refresh,delete等操作 相当于2.2版本的

1
schema.enableActiveEntitiesByDefault();

nameInDb 就是写个存在数据库里的表名(不写默认是一致)

indexes 定义索引,这里可跨越多个列

CreateInDb 如果是有多个实体都关联这个表,可以把多余的实体里面设置为false避免重复创建(默认是true)

2.3索引注解

@Entity
public class User {@Id private Long id;@Index(unique = true)private String name;
}@Entity
public class User {@Id private Long id;@Unique private String name;
}

其中

@Index 通过这个字段建立索引

@Unique 添加唯一约束,上面的括号里unique=true作用相同

2.4关系注解

@Entity
public class Order {@Id private Long id;private long customerId;@ToOne(joinProperty = "customerId")private Customer customer;
}@Entity
public class Customer {@Id private Long id;

@ToOne 是将自己的一个属性与另一个表建立关联,相当于2.2版本的

Property property = entity.addLongProperty("customerId").getProperty(); <br>entity.addToOne(Customer, property);

@ToMany 的使用场景有些多,下面的代码默认折叠起来

+ View Code

@ToMany的属性referencedJoinProperty,类似于外键约束。

@JoinProperty 对于更复杂的关系,可以使用这个注解标明目标属性的源属性。

@JoinEntity 如果你在做多对多的关系,有其他的表或实体参与,可以给目标属性添加这个额外的注解(感觉不常用吧)

2.5派生注解

@Generated 这个是build后greendao自动生成的,这个注解理解为防止重复,每一块代码生成后会加个hash作为标记。 官方不建议你去碰这些代码,改动会导致里面代码与hash值不符。

三、数据库加密

在Greendao的迭代流程中可以看到这么一个库

compile 'org.greenrobot:greendao-generator-encryption:3.0.0beta3'

Greendao3 与下面这个加密库合作,encryption:3.0.0beta-3相当于一个适配层,之后迭代中并入greendao主库的3.0.1版本,对database相关的api进行了统一。

compile 'net.zetetic:android-database-sqlcipher:3.5.2'

之前的版本也是支持加密的,但是可以理解为在相互api传递数据的时候面临各种类型转换,3.0将其统一,使用更加流畅。

可以直接看写代码使用

User man1 = new User();
man1.setId(10001);
man1.setName("kobe");DaoMaster.DevOpenHelper a = new DaoMaster.DevOpenHelper(this,"database_name",null);
try {daoSession = new DaoMaster(a.getEncryptedWritableDb(MY_PWD)).newSession();daoSession.getUserDao().insert(man1);}catch (Exception e){Log.d("e", String.valueOf(e));
}// 若干代码逻辑后。。。

DaoSession normalSession = new DaoMaster(a.getWritableDb()).newSession();
Log.d("无法取数据",normalSession.getUserDao().loadAll().toString());DaoSession encryptedSession = new DaoMaster(a.getEncryptedWritableDb(MY_PWD)).newSession();//董铂然 博客园
Log.d("可以取数据",encryptedSession.getUserDao().loadAll().toString());

如上方代码所示,相比于之前的方法getWriteableDb,加密的方法是用了getEncryptedWritableDb。 并在得到DB并getSession时需要输入密钥。 其他的步骤和之前类似。

在取数据时使用的session必须也是使用相同的密钥new出来的,否则只能看到空数据。

07-27 /com.XXX.dsx.testgreendao3 D/无法取数据: []
07-27 /com.XXX.dsx.testgreendao3 D/可以取数据: [com.XXX.dsx.testgreendao3.User@2ae5190]

上面的那个MY_PWD是一个静态变量,建议使用本设备的唯一标识类似于UUID的字段做个加密获得,这样每个机器的密钥是不同的,并且不会发生改变。

如果把加密后的数据库的本地文件扒出来,也是查不到内容的, 使用dump仅仅可以看到表结构和列名。

  

如果觉得还不满意,可以对列名再进行加密。在建表时就对列名加密,后续使用可能会比较麻烦,建议加密一些关键表如USER,ACCOUNT。

其中

schema是一个项目中有多个schema时 标明要让这个dao属于哪个schema

active 是标明是否支持实体类之间update,refresh,delete等操作 相当于2.2版本的

1
schema.enableActiveEntitiesByDefault();

nameInDb 就是写个存在数据库里的表名(不写默认是一致)

indexes 定义索引,这里可跨越多个列

CreateInDb 如果是有多个实体都关联这个表,可以把多余的实体里面设置为false避免重复创建(默认是true)

2.3索引注解

1
2
3
4
5
6
7
8
9
10
11
12
@Entity
public class User {
    @Id private Long id;
    @Index(unique = true)
    private String name;
}
@Entity
public class User {
    @Id private Long id;
    @Unique private String name;
}

其中

@Index 通过这个字段建立索引

@Unique 添加唯一约束,上面的括号里unique=true作用相同

2.4关系注解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Entity
public class Order {
    @Id private Long id;
  
    private long customerId;
  
    @ToOne(joinProperty = "customerId")
    private Customer customer;
}
  
@Entity
public class Customer {
    @Id private Long id;
}

@ToOne 是将自己的一个属性与另一个表建立关联,相当于2.2版本的

1
Property property = entity.addLongProperty("customerId").getProperty(); <br>entity.addToOne(Customer, property);

@ToMany 的使用场景有些多,下面的代码默认折叠起来

+ View Code

@ToMany的属性referencedJoinProperty,类似于外键约束。

@JoinProperty 对于更复杂的关系,可以使用这个注解标明目标属性的源属性。

@JoinEntity 如果你在做多对多的关系,有其他的表或实体参与,可以给目标属性添加这个额外的注解(感觉不常用吧)

2.5派生注解

@Generated 这个是build后greendao自动生成的,这个注解理解为防止重复,每一块代码生成后会加个hash作为标记。 官方不建议你去碰这些代码,改动会导致里面代码与hash值不符。

三、数据库加密

在Greendao的迭代流程中可以看到这么一个库

1
compile 'org.greenrobot:greendao-generator-encryption:3.0.0beta3'

Greendao3 与下面这个加密库合作,encryption:3.0.0beta-3相当于一个适配层,之后迭代中并入greendao主库的3.0.1版本,对database相关的api进行了统一。

1
compile 'net.zetetic:android-database-sqlcipher:3.5.2'

之前的版本也是支持加密的,但是可以理解为在相互api传递数据的时候面临各种类型转换,3.0将其统一,使用更加流畅。

可以直接看写代码使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
User man1 = new User();
man1.setId(10001);
man1.setName("kobe");
DaoMaster.DevOpenHelper a = new DaoMaster.DevOpenHelper(this,"database_name",null);
try {
    daoSession = new DaoMaster(a.getEncryptedWritableDb(MY_PWD)).newSession();
    daoSession.getUserDao().insert(man1);
}catch (Exception e){
    Log.d("e", String.valueOf(e));
}
// 若干代码逻辑后。。。
DaoSession normalSession = new DaoMaster(a.getWritableDb()).newSession();
Log.d("无法取数据",normalSession.getUserDao().loadAll().toString());
DaoSession encryptedSession = new DaoMaster(a.getEncryptedWritableDb(MY_PWD)).newSession();//董铂然 博客园
Log.d("可以取数据",encryptedSession.getUserDao().loadAll().toString());

如上方代码所示,相比于之前的方法getWriteableDb,加密的方法是用了getEncryptedWritableDb。 并在得到DB并getSession时需要输入密钥。 其他的步骤和之前类似。

在取数据时使用的session必须也是使用相同的密钥new出来的,否则只能看到空数据。

1
2
07-27 /com.XXX.dsx.testgreendao3 D/无法取数据: []
07-27 /com.XXX.dsx.testgreendao3 D/可以取数据: [com.XXX.dsx.testgreendao3.User@2ae5190]

上面的那个MY_PWD是一个静态变量,建议使用本设备的唯一标识类似于UUID的字段做个加密获得,这样每个机器的密钥是不同的,并且不会发生改变。

如果把加密后的数据库的本地文件扒出来,也是查不到内容的, 使用dump仅仅可以看到表结构和列名。

  

如果觉得还不满意,可以对列名再进行加密。在建表时就对列名加密,后续使用可能会比较麻烦,建议加密一些关键表如USER,ACCOUNT。

分类: Android相关
标签: 数据库, Android, Greendao3.0
好文要顶 关注我 收藏该文  

董铂然
关注 - 17
粉丝 - 494

+加关注

7

« 上一篇:Android数据库相关整理
» 下一篇:GreenDao2.2升级GreenDao3.0的适配之路

posted @ 2016-07-28 09:09 董铂然 阅读(16039) 评论(4) 编辑 收藏

评论列表
回复引用

#1楼 2016-09-02 17:54 zcm3579

请问greendao3支不支持直接保存基本类型?,还是必须使用Long,Integer这些封装类?
支持(0)反对(0)

回复引用

#2楼[楼主] 2016-09-05 09:23 董铂然

@ zcm3579
可以使用基本数据类型。
支持(0)反对(0)

回复引用

#3楼 2016-09-06 11:44 zcm3579

@ 董铂然
谢谢,还想请问一般建议使用基本类型还是封装类型? 在旧项目中使用了GreenDao1.X的版本,保存的都是封装类,在使用的时候很多地方都出现了空指针,请问如果GreenDao升级到3.0并且将数据改为基本类型会不会好一点?
支持(0)反对(0)

回复引用

#4楼[楼主] 2016-09-06 15:52 董铂然

@ zcm3579
建议还是用封装类型吧,因为在传输层本生就都要使用封装类型。如果这个bean就是自己随便用 不走网络,那用普通也行。
支持(0)反对(0)

刷新评论刷新页面返回顶部
发表评论

昵称:

评论内容:
     

退出 订阅评论

[Ctrl+Enter快捷键提交]

【推荐】50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
【力荐】普惠云计算 0门槛体验 30+云产品免费半年
【推荐】可嵌入您系统的“在线Excel”!SpreadJS 纯前端表格控件
【推荐】阿里云“全民云计算”优惠升级
最新IT新闻:
· 专家看走眼了 iPhone未来十年还将主导智能手机市场
· 腾讯携手Intel开发区块链技术,推动构建物联网安全能力
· Linux发行版SUSE诞生二十五周年
· 今日头条停止微博账号服务:二者竞争又加剧
· 全球首款12TB硬盘终于开卖:HGST出品 4530元
» 更多新闻...
最新知识库文章:

· 做到这一点,你也可以成为优秀的程序员
· 写给立志做码农的大学生
· 架构腐化之谜
· 学会思考,而不只是编程
· 编写Shell脚本的最佳实践

» 更多知识库文章...

公告

#本博客内所有随笔均为原创!#
#欢迎前往我的github查看各种开源项目#

联系邮箱:
dantesx2012@gmail.com
GitHub地址:
https://github.com/dsxNiubility

昵称:董铂然
园龄:2年7个月
粉丝:494
关注:17

+加关注

< 2017年9月 >
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
1 2 3 4 5 6 7

搜索

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论
  • 我的标签

随笔分类

  • Android相关(4)
  • Objective-C相关(28)
  • Swift相关(7)
  • Xmpp相关(5)
  • 方法论(3)
  • 高效工具(5)
  • 工程质量(4)

随笔档案

  • 2017年2月 (1)
  • 2016年12月 (2)
  • 2016年9月 (1)
  • 2016年8月 (2)
  • 2016年7月 (2)
  • 2016年6月 (2)
  • 2016年5月 (2)
  • 2016年4月 (2)
  • 2016年3月 (2)
  • 2016年1月 (2)
  • 2015年12月 (1)
  • 2015年11月 (2)
  • 2015年10月 (2)
  • 2015年9月 (2)
  • 2015年8月 (2)
  • 2015年7月 (2)
  • 2015年6月 (2)
  • 2015年5月 (3)
  • 2015年4月 (2)
  • 2015年3月 (12)
  • 2015年2月 (6)
  • 2015年1月 (2)

相册

  • 产品经理(1)
  • 默认相册(11)

积分与排名

  • 积分 - 136552
  • 排名 - 1818

最新评论

  • 1. Re:UIWebView的应用和其中的JS与OC间传值
  • ios请求网页,网页返回要显示的html的内容,包括图片,广告,链接等,然后oc把数据返回给js,js显示界面,但是最后页面没有显示出来,有什么解决办法吗
  • --看书有道
  • 2. Re:谈谈iOS app的线上性能监测
  • “计算一个viewcontroller从viewdidload的第一行到viewdidappear的最后一行所用的时间”如果像这样计算渲染时间:首先它只能是静态的 其次它没有计算下面层级的 view ......
  • --lucia_gaga
  • 3. Re:iOS使用Charles(青花瓷)抓包并篡改返回数据图文详解
  • @城城Baby先打个断点,然后再操作APP,请求到这个接口的时候,自动会跳转到打断点的接口request请求修改页,此时可以修改request请求参数;若不需要,直接点击cancel后显示,修改res......
  • --维也纳729
  • 4. Re:xmpp整理笔记:环境的快速配置(附安装包)
  • 你好,你的网盘链接地址失效了,请问能再给我发一个链接吗吗?谢谢! 1431761424@qq.com
  • --Tcm_Y
  • 5. Re:xmpp整理笔记:xmppFramework框架的导入和介绍
  • 虽然这一节看起来没有问题,但的确应该是写错了。
  • --莫一多

阅读排行榜

  • 1. 整理iOS9适配中出现的坑(图文)(20319)
  • 2. iOS使用Charles(青花瓷)抓包并篡改返回数据图文详解(18409)
  • 3. GreenDao3.0新特性解析(配置、注解、加密)(16035)
  • 4. 对iOS10新增Api的详细

GreenDao3.0新特性解析(配置、注解、加密)相关推荐

  1. Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析

    在Spring Boot 2.0中推出了Relaxed Binding 2.0,对原有的属性绑定功能做了非常多的改进以帮助我们更容易的在Spring应用中加载和读取配置信息.下面本文就来说说Sprin ...

  2. Java-Web 基础加强之泛型、注解和Servlet3.0新特性

    目录 一.泛型 1.泛型类 2.泛型方法 3.继承(实现)泛型类(接口) 4.通配符 (1)通配符概述 (2)通配符的缺点 (3)通配符的限制 (4)带有下边界的通配符 (5)带有下边界的通配符 (6 ...

  3. Java基础加强-(注解,动态代理,类加载器,servlet3.0新特性)

    1.   Annotation注解 1.1.  Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annota ...

  4. SpringBoot2.0新特性 - Quartz自动化配置集成

    https://www.jianshu.com/p/056281e057b3 在新版本的SpringBoot2.0发布后,急迫尝鲜的我将相关的项目已经更换为最新版本,在SpringBoot源码GitH ...

  5. Servlet 3.0 新特性概述

    Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若 ...

  6. Java自学手记——servlet3.0新特性

    servlet3.0出来已经很久了,但市场上尚未普遍应用,servlet3.0有三个比较重要的新特性:使用注解来代替配置文件,异步处理以及上传组件支持. 支持servlet3.0的要求:MyEclip ...

  7. mysql8.0默认引擎是什么_MySQL8.0新特性【转】

    Server层,选项持久化 mysql> show variables like '%max_connections%';+------------------------+-------+ | ...

  8. Servlet 3.0 新特性详解

    https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE ...

  9. Redis 6.0 新特性-多线程连环13问!

    来自:码大叔 导读:支持多线程的Redis6.0版本于2020-05-02终于发布了,为什么Redis忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有 ...

最新文章

  1. 【经典课程】李宏毅机器学习2020版正式上线!!!
  2. 如何在网站建设时正确设置符合SEO优化的元素?
  3. 怎么在代码中打开、关闭屏幕旋转
  4. Spring IOC的理解总结
  5. EOF是什么?(转)
  6. 【Python笔记】使用 re 模块实现正则表达式操作
  7. 从芯片到 AI,52 岁英特尔的蜕变!
  8. stm32双串口通信_一文读懂,基于 STM32 和 CAN 总线的温度监控系统的设计方法
  9. Linux下安装AliSQL(MySQL)及相关环境配置
  10. Oracle10g安装教程、配置实例、监听、客户端程序详解_Windows篇
  11. Multisim10~14软件包及安装手册+pojie软件
  12. 徐耀赐:人因与道路工程设计1(图文版)
  13. 企业口碑营销如何做好,可运用这5T理论
  14. 10 种为React应用程序设计样式的方法
  15. r语言中which的使用_大数据分析R语言RStudio使用教程
  16. thinkphp 面包屑导航
  17. php curl couldnt connect to host,linux curl命令:curl: (7) couldn't connect to host ?
  18. mat 释放_Opencv - 释放内存将cv :: Mat引用计数器更改为零
  19. 苏嵌//郑艳秋//2018.7.12
  20. ansilbe模块幂等性

热门文章

  1. 邮件服务器之SMTP协议分析
  2. 怎样从网页登录服务器切换,原神官服和b服怎么切换
  3. Docker极速构建
  4. 【nature论文精读】Impedance-based forecasting of lithium-ion battery performance amid uneven usage
  5. 如何用python整理文件夹_python按照文件创建日期整理文件至文件夹
  6. 个人公众号历史文章合集
  7. html弹出窗口是浮动,JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
  8. 2022.04.13 对称二叉树
  9. “中国IT外包新视界”圆满结束
  10. 燕郊至北京驾车路线大汇总