当前位置:网站首页 > 技术博客 > 正文

android greendao原理



在这里插入图片描述

马上过年了,近期不是很忙,总结一篇关于GreenDao的详解文章
greenDAO增删改查在不同情况下的应用,以及模拟离线和线上的数据存储
结尾附有Demo以及下载地址

官网简介:

       greenDAO is an open source library for Android providing an easy-to-use interface to SQLite to help developers handle data efficiently – relieving developers from dealing with low-level database stuff and saving development time. SQLite is an awesome embedded relational database. Still, writing SQL and parsing query results are quite tedious and time-consuming tasks. greenDAO frees you from these by mapping Java objects to database tables (often called ORM). This way you can store, update, delete, and query for Java objects using a simple object oriented API.
————————————————
       greenDAO是一款开放源代码的Android ORM,使SQLite数据库的开发变得有趣。它减轻开发人员处理低级数据库需求,同时节省开发时间。SQLite是一个令人敬畏的嵌入式关系数据库。不过,编写SQL和解析查询结果是相当乏味和耗时的任务。通过将Java对象映射到数据库表(称为ORM “对象/关系映射”),greenDAO可以将它们从这些映射释放出来。这样,您可以使用简单的面向对象的API来存储,更新,删除和查询Java对象。

在这里插入图片描述

GreenDao的功能
  • 一个精简的库
  • 性能最大化
  • 内存开销最小化
  • 易于使用的 APIs
  • 对 Android 进行高度优化
  • 2.2版本以上还支持加密数据库
  • 支持protobuf协议存储(protobuf 比json更快,google的优秀产品,因此greendao能很好地与retrofit 2.0结合protobuf网络请求并缓存)
GreenDao的主要特点
  • 性能远胜于ORMLite ActiveAndroid Xutils等
  • greendao是两级数据库,分为持久的内存sqlite数据库与内存数据库,如果频繁操作数据库的话,建议是用内存数据库,然后持久到sqlite中,这样的性能远胜于原生的sqlite,即使不使用内存数据库,也几乎与原生sqlite的效率几乎接近。
  • greenDAO 支持 protocol buffer(protobuf) 协议数据的直接存储,如果你通过 protobuf
    协议与服务器交互,将不需要任何的映射。
  • 与 ORMLite 等使用注解方式的 ORM 框架不同,greenDAO 使用「Code
    generation」的方式,这也是其性能能大幅提升的原因。
GreenDao源码

在这里插入图片描述

GreenDao主体结构

在这里插入图片描述

  • GreenDao的配置

  1. 在app下的gradle配置相关依赖以及数据库相关信息
 
  
  1. 在app同级的gradle中导入插件
 
  

GreenDao的使用

  1. 全局初始化
 
  
  1. 创建一个实体类
 

在这里插入图片描述


  1. buid一下项目

    在这里插入图片描述


  2. greendao.gen目录下会自动生成greenDAO三个类文件!这时候证明数据连接成功了

    在这里插入图片描述


  3. Activity初始化数据库
 
  1. 增删改查
  • 增加

在这里插入图片描述


  • 删除
 
关于GreenDao 数据去重
  1. 定义实体类Bean的时候,找到唯一数据值,设置注解
    设置属性,在GreenDao创建数据库表时会自动为此字段创建唯一索引

在这里插入图片描述

  1. 在插入数据时如果违反唯一性会抛出异常。

在这里插入图片描述

 
 

(4)插入后删除重复,先将所有数据插入,然后通过查询找出重复数据并删除。

 

- 修改

在使用修改的操作的时候,这里总结了一个使用时候的bug
对单条数据进行修改的话,是不会出现问题的
但是如果出现多条重名的数据,进行修改的话,会报一个错,如下:

 

在这里插入图片描述

这时候就不能用unique了,修改为list,就可以解决以上问题,修改如下:

 
  • 查询

QueryBuilder的使用

QueryBuilder的常见方法: where(WhereCondition cond, WhereCondition…
condMore): 查询条件,参数为查询的条件! or(WhereCondition cond1, WhereCondition
cond2, WhereCondition… condMore): 嵌套条件或者,用法同or。 and(WhereCondition
cond1, WhereCondition cond2, WhereCondition… condMore):
嵌套条件且,用法同and。 join(Property sourceProperty, Class
destinationEntityClass):多表查询
输出结果有四种方式,选择其中一种最适合的即可,list()返回值是List,而其他三种返回值均实现Closeable,需要注意的不使用数据时游标的关闭操作:
list ()所有实体都加载到内存中。结果通常是一个没有魔法的 ArrayList。最容易使用。 listLazy
()实体按需加载到内存中。首次访问列表中的元素后,将加载并缓存该元素以供将来使用。必须关闭。 listLazyUncached
()实体的“虚拟”列表:对列表元素的任何访问都会导致从数据库加载其数据。必须关闭。 listIterator
()让我们通过按需加载数据(懒惰)来迭代结果。数据未缓存。必须关闭。 orderAsc() 按某个属性升序排; orderDesc()
按某个属性降序排;











GreenDao中SQL语句的缩写,我们也了解下,源码在Property中,使用的时候可以自己点进去查询即可:
eq():"equal ('=?')" 等于;
notEq() :"not equal ('<>?')" 不等于;
like():" LIKE ?" 值等于;
between():" BETWEEN ? AND ?" 取中间范围;
in():" IN (" in命令;
notIn():" NOTIN (" not in 命令;
gt():">?" 大于;
lt():"<? " 小于;
ge():">=?" 大于等于;
le():"<=? " 小于等于;
isNull():" IS NULL" 为空;
isNotNull():" IS NOT NULL" 不为空;












 
  • 模拟有网/无网数据处理问题

在这里插入图片描述

如果想了解完整功能,可以扫码下载

项目下载地址:GreenDaoMaster






  • 上一篇: fdisk分区命令
  • 下一篇: pyqt5入门教程
  • 版权声明


    相关文章:

  • fdisk分区命令2025-07-30 19:30:03
  • 程序加密原理2025-07-30 19:30:03
  • 计算机组成原理第5章2025-07-30 19:30:03
  • 用什么查看网络接口的状态2025-07-30 19:30:03
  • unity ugui教程2025-07-30 19:30:03
  • pyqt5入门教程2025-07-30 19:30:03
  • java实现文件上传的三种方式2025-07-30 19:30:03
  • 归并排序的代码2025-07-30 19:30:03
  • udp结构图2025-07-30 19:30:03
  • 私藏的18个黑科技网站2025-07-30 19:30:03