专栏名称: 郭霖
Android技术分享平台,每天都有优质技术文章推送。你还可以向公众号投稿,将自己总结的技术心得分享给大家。
目录
相关文章推荐
鸿洋  ·  Android系统native进程之我是in ... ·  2 天前  
鸿洋  ·  安卓应用跳转回流的统一和复用 ·  3 天前  
郭霖  ·  Android ... ·  4 天前  
郭霖  ·  Android 跨进程+解耦的数据持久化方案 ·  1 周前  
鸿洋  ·  一个大型 Android 项目的模块划分哲学 ·  1 周前  
51好读  ›  专栏  ›  郭霖

GreenDAO3.2初探

郭霖  · 公众号  · android  · 2017-05-27 08:00

正文

今日科技快讯

近日,乐视体育宣布B+轮融资进展,乐视体育部分新老股东以及政府背景的中意宁波生态园(国家级生态园)下属基金确认参与B+轮,投后估值达到240亿元。本次增资主要用于在线下布局的体育产业,包括赛事运营、户外旅游、体育培训等产品。此外,乐视体育还计划将总部从北京搬迁至中意宁波生态园。

作者简介

连上六天班,明天终于放假了,这里提前祝大家端午节快乐!

本篇来自 zone_ 的投稿,分享了自己入门greanDao的经验,希望能帮助到那些对greanDao感兴趣但尚未了解的童鞋。

zone_ 的博客地址:

http://blog.csdn.net/zone_

前言

greenDAO

http://greenrobot.org/greendao/documentation

在之前就有耳闻,但是没空出时间去学习,今天突然看到了这个词,于是乎就决定搞定它,啃一下英文文档。那么故事就来了。首先说说我所了解到的,为什么选用 greenDAO:

  • greenDAO 可以将我们数据库的中数据转换为相应的对象,这样可以省去我们自己去转换对象的时间。

  • 和同类型的库相比,性能是最好的。(官网如是说)主流同类型库的条形对比图如下图。

  • greenDAO 也是当前 Android 开发中比较流行的库,当前的 github 星星数为 7278。

  • 使用 SQL 语句进行查询容易出错,而且错误比较难以发现,使用 greenDAO 的话可以在编译阶段就发现错误。(官网说的)

  • 还有就是代码比较简单明了,程序员都想用最少的代码,做最多的事,原谅我是个偷懒的程序猿。哈哈。

  • 轻量级,整个库大小小于 150 k。 

那么我们就开始学习吧。

引用greanDAO

当前的 greenDAO 要求 gradle 的版本至少是 3.3 ,我升级 gradle 折腾了半个小时,附上:

升级gradle的方法:

http://www.orzapp.com/?p=269

gradle下载地址:

https://pan.baidu.com/s/1pLEkm4F#list/path=%2F

实体类的生成

实体类中常用的注解:

@Entity  表明这个实体类会在数据库中生成一个与之相对应的表。

@Id  对应数据表中的 Id 字段,有了解数据库的话,是一条数据的唯一标识。

@Property(nameInDb = “STUDENTNUM”)  表名这个属性对应数据表中的 STUDENTNUM 字段。

@Property  可以自定义字段名,注意外键不能使用该属性

@NotNull  该属性值不能为空

@Transient  该属性不会被存入数据库中

@Unique  表名该属性在数据库中只能有唯一值

当你写完实体类中的属性之后,点击编译,就会自动生成相应的 setter 和 getter 方法,至于那些 hash 值是自动赋值上去的。并且在该目录下生成 DaoMaster 和 DaoSession 这两个类用于初始化数据库。

增删改查

一般数据库的操作都离不开增删改查,那么我们就从这开始。

初始化

如果实体类有更新,那么要调用 daoSession.clear() 清除缓存,才能得到更新。



需要注意的是 offset 是要和 limit 配合使用的。

  • list() 所有实体会直接加载到内存中。

  • listLazy() 当你需要使用时,才会加载,会自动缓存。使用完必须关闭。

  • listLazyUncached() 如你所见,就是不会缓存的意思。使用完必须关闭。

  • listIterator() 通过迭代器遍历结果集,不会缓存。使用完必须关闭。

  • unique() 返回一个或者零个结果

  • uniqueOrThrow() 返回非空的结果,否则抛出异常

listLazy(), listLazyUncached(), listIterator() 这三个方法都使用了 LazyList.class 这个类。它持有了数据库游标的引用,这就是为什么要关闭的原因。当然,当你遍历完所有的结果集,它是会自动关闭的。如果没有遍历完,就得手动关闭了。

当多次使用到查询的时候,更加高效的方法是新建一个 Query 对象。然后根据需要更改相应的查询参数。

query.setParameter(index, condition);

来说说这行代码的参数,首先 index 是从 0 开始算的,它是基于你所传的参数的顺序来定的。然后是 condition 这个就是你要修改的相应参数。这些算是基础操作了,那么下面我们来更深一步地学习。

1:1查询

其实就是两张表联表查询。想象一下你高中的时候,每次到期末,学校都会发一张期末各科的成绩单给你,假定你只要学习英语和数学这两门学科,一个学生对应一张成绩单。那么下面的代码就是描述这种情况的。

学生实体类:

成绩实体类:

如上两段代码是两个实体类,为了方便查看,我进行了简化。通过让第一个实体类持有一个外键,这个外键是第二个实体类的 id 。让 greenDAO 能通过这个外键来查询到相应的数据。那么来看一下小 demo :

1:n

想象一下你写博客,你写了 n 篇博文,那么对于你来说,就是一对多的关系,那么接下来的 demo 就是关于这个的。实现一对多的方式有两种,先看看第一种

第一种:

作者实体类如下:(此处省略了 setter getter 等方法)

博文实体类如下:(此处省略了 setter getter 等方法)

第二种方法:

referencedJoinProperty 是 @JoinProperty 的特例,这是一种自定义关联的方式。下面的代码中是通过 alias 和 authorAlias 进行关联。如果将 alias 改为 id ,将 authorAlias 改为 authorId ,那么第一种方法和第二种方法是等价的。

RxDao

最近响应式编程在 Android 这边也是火热朝天,那么我们也一起来探索一下 greenDAO 的 Rx 版。

初始化




ok,学习到这里,初探也告一段落了,还有更加深入的用法就得靠大家来告诉我了,哈哈。

更多

每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都有好心情。

如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。

欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号: