Android ORM 框架:GreenDao 使用详解

  • 最近太忙了,直接引用网上的图片

一、GreenDao 简介

greenDAO 是一款开源的面向 Android 的轻便、快捷的 ORM 框架,将 Java 对象映射到 SQLite 数据库中,我们操作数据库的时候,不在需要编写复杂的 SQL语句, 在性能方面,greenDAO 针对 Android 进行了高度优化, 最小的内存开销 、依赖体积小 同时还是支持数据库加密。

greenDAO 官网地址:http://greenrobot.org/greendao/

二、GreenDao 特征:

1、对象映射( ORM)

  • greenDAO 是ORM 框架,可以非常便捷的将Java 对象映射到 SQLite 数据库中保存。

2、高性能

  • ORM 框架有很多,比较著名的有 OrmLite , ActiveAndroid 等,性能也不一样,下图是 GreenDao 官方给出的性能对比。

3、支持加密

  • GreenDao 是支持加密的,可以安全的保存用户数据。

4、轻量级

  • GreenDao 核心库小于100k ,所以我们并不会担心添加 GreenDao 后 APK 大小会变的是否庞大。

5、支持 protocol buffer(protobuf) 协议

  • GreenDao 支持 protocol buffer(protobuf) 协议数据的直接存储,如果你通过 protobuf 协议与服务器交互,将不需要任何的映射。

6,代码生成

  • greenDAO 会根据配置信息自动生成核心管理类以及 DAO 对象

7,开源

  • greenDAO 是开源的,我们可以在github 上下载源码,学习。github 地址:https://github.com/greenrobot/greenDAO

三、核心类介绍

DaoMaster:

  • 使用 greenDAO 的入口点。DaoMaster 负责管理数据库对象(SQLiteDatabase)和 DAO 类(对象),我们可以通过它内部类 OpenHelper 和 DevOpenHelper SQLiteOpenHelper 创建不同模式的 SQLite 数据库。

DaoSession :

  • 管理指定模式下的所有 DAO 对象,DaoSession提供了一些通用的持久性方法比如插入、负载、更新、更新和删除实体。

XxxDAO :

  • 每个实体类 greenDAO 多会生成一个与之对应DAO对象,如:User 实体,则会生成一个一个UserDao 类

Entities

  • 可持久化对象。通常, 实体对象代表一个数据库行使用标准 Java 属性(如一个POJO 或 JavaBean )。

核心类之间的关系


四、 集成 GreenDAO

a、设置仓库与插件(Project: build.gradle)

    buildscript {repositories {jcenter()mavenCentral() // add repository}dependencies {classpath 'com.android.tools.build:gradle:2.3.2'classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin}}

b、 配置依赖 ( Module:app build.gradle )

    apply plugin: 'com.android.application'apply plugin: 'org.greenrobot.greendao' // apply plugindependencies {compile 'org.greenrobot:greendao:3.2.2' // add library// This is only needed if you want to use encrypted databasescompile 'net.zetetic:android-database-sqlcipher:3.5.6'//加密库依赖(可选项)}

c、 配置数据库相关信息 ( Module:app build.gradle )

    greendao {schemaVersion 1 //数据库版本号daoPackage 'com.speedystone.greendaodemo.db'// 设置DaoMaster、DaoSession、Dao   一般包名+文件夹名targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录   文件生成的目录,相当于父级目录}

d、点击 : Sync Project with Gradle Files 按钮,同步一下工程 , 配置完成


五、快速入门

1, 我们写一个简单的实体类(User),测试一下

    package com.speedystone.greendaodemo.model;import org.greenrobot.greendao.annotation.Entity;import org.greenrobot.greendao.annotation.Id;/*** Created by Speedy on 2017/6/30.*/@Entitypublic class User {@Idprivate long id;private String name;private int age;//此处省略了getter,setter 方法}

2、点击 Make Project(或者 Make Moudle ‘App’) 编译一下工程 。如果配置正确,会在配置的包目录下自动会生成 DaoMaster,DaoSession 和 UserDao 类 。(没有对应文件产生式可以重启一下Androidstudio)

3,初始化 GreenDao ( 通常初始化代码写在我们的 Application 类中)

    public class MApplication extends android.support.multidex.MultiDexApplication {private DaoSession daoSession;@Overridepublic void onCreate() {super.onCreate();initDreenDao();}/*** greendao数据库初始化*/private void initDreenDao() {DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(this, "zbc_test.db");SQLiteDatabase db = devOpenHelper.getWritableDatabase();DaoMaster daoMaster = new DaoMaster(db);daoSession = daoMaster.newSession();}/*** 获取 DaoSession** @return*/public DaoSession getDaoSession() {return daoSession;}}

4,获取 UserDao

    MyApp myApp = (MyApp) getApplication();DaoSession daoSession =  myApp.getDaoSession();UserDao userDao = daoSession.getUserDao();

5, 保存记录

5.1插入记录到数据库,id重复时不修改,会抛出异常,注意捕获

 User user = new User();user.setUserId(1);user.setName("小明");user.setAge(16);userDao.insert(user);

5.2插入记录到数据库,id重复时直接替换

User user = new User();user.setUserId(1);user.setName("小明");user.setAge(16);//插入或者替换userDao.insertOrReplace(user);

6, 删除记录

    public void delete(User user){userDao.delete(user);}

或者

    public void deleteByUserId(long userid){userDao.deleteByKey(1L);}

7,更新记录

    public void update(User user){userDao.update(user);}

8,查询记录

    public List query(){return userDao.loadAll();// 查询所有记录}public User query2(){return userDao.loadByRowId(1);//根据ID查询}public List query2(){return userDao.queryRaw("where AGE>?","10");//查询年龄大于10的用户}//查询年龄大于10的用户public List query4(){QueryBuilder builder = userDao.queryBuilder();return  builder.where(UserDao.Properties.Age.gt(10)).build().list();}

六、注解详解

名称 作用
@Entity 表明这个实体类会在数据库中生成一个与之相对应的表
schema 告知GreenDao当前实体属于哪个 schema
schema active 标记一个实体处于活跃状态,活动实体有更新、删除和刷新方法
nameInDb 在数据库中使用的别名,默认使用的是实体的类名,
indexes 定义索引,可以跨越多个列
createInDb 标记创建数据库表(默认:true)
generateConstructors 自动创建全参构造方法(同时会生成一个无参构造方法)(默认:true)
generateGettersSetters 自动生成 getters and setters 方法(默认:true)
@Id 对应数据表中的 Id 字段
@Index 使用@Index作为一个属性来创建一个索引,默认是使用字段名
@Property 设置一个非默认关系映射所对应的列名,默认是使用字段名,例如:@Property(nameInDb = “userName”)
@NotNull 设置数据库表当前列不能为空
@Transient 添加此标记后不会生成数据库表的列
@Unique 表名该属性在数据库中只能有唯一值
@ToOne 表示一对一关系
@OrderBy 更加某一字段排序 ,例如:@OrderBy(“date ASC”)
@ToMany 定义一对多个实体对象的关系

@Entity

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

@Id 、@Index

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

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

    @Entitypublic class User {@Id private Long id;@Uniqueprivate String name;}

@ToOne 表示一对一关系

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

@OrderBy 更加某一字段排序 ,例如:@OrderBy(“date ASC”)

@ToMany 定义一对多个实体对象的关系

@Entity
public class Customer {@Id private Long id;@ToMany(referencedJoinProperty = "customerId")@OrderBy("date ASC")private List orders;
}@Entity
public class Order {@Id private Long id;private Date date;private long customerId;
}

下面总结里一些GreenDao的使用心得

使用 .insert(userEntity); 方法时候报错,APP直接的崩溃闪退

android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: USER_ENTITY._id (Sqlite code 1555), (OS error - 2:No such file or directory)

如图:

最终解决

可能发生这种BUG的两种情况

1:定义的字段为NOT NULL,而插入时对应的字段为NULL

2:你定义的自动为PRIMARY,而插入时想插入的值已经在表中存在。

针对情况2,建议用replace代替insert

通过这一点可以看出一个应用的场景:

1.如果不希望新增的数据替换相同key值的已有数据,我们可以采用 insert 方法

2.如果希望新来得数据无论如何也会替换相同key值的旧数据,应当使用 replace 方法

GreenDao 使用详解(入门篇)相关推荐

  1. mhdd应用详解-入门篇(图文教程)

    mhdd应用详解-入门篇(图文教程) 来源:wxiu.com 作者:fox 时间:2009-03-13 点击: 54 对于专业的 电脑维修人员来说, MHDD是必备的硬盘工具,但是技术人员一般只拿他 ...

  2. Gson详解--入门篇

    Gson 目前主流的json解析类库有jackson,fastjson,gson,gson的serialization deserialization解析功能无疑是最强大的,基本上完美支持复杂对象的j ...

  3. WebSocket四种事件详解 入门篇(二)

    示例代码  在文章最下方,可以根据示例代码和讲解来理解整个WebSocket流程.代码用SpringBoot 和 maven搭建 服务端和客户端四种事件 1.打开事件 此事件发生在端点上建立新连接时并 ...

  4. androidentity什么用_Android ORM 框架:GreenDao 使用详解(进阶篇)

    前言 在 Android ORM 框架:GreenDao 使用详解(基础篇) 中,我们了解了 GreenDao 的基本使用,本文我们将深入讲解 GreenDao 的使用 . 一.复杂表结构 a, 使用 ...

  5. IIS负载均衡-Application Request Route详解第一篇: ARR介绍

    IIS负载均衡-Application Request Route详解第一篇: ARR介绍   说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Appli ...

  6. IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm

    自从本系列发布之后,收到了很多的朋友的回复!非常感谢,同时很多朋友问到了一些问题,有些问题是一些比较基本的问题,由于时间的缘故,不会一一的为大家回复,如果有不明白的,希望大家勤自学!本系列虽然不难,但 ...

  7. IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm(转载)

    IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm 自从本系列发布之后,收到了很多的朋友的回复!非常感谢,同时很多朋友问到了一些问题,有些问 ...

  8. Linux使用详解(进阶篇)

    文章目录 Linux使用详解(进阶篇) 1.Linux目录说明 2.操作防火墙 3.ulimit命令和history命令 4.RPM和Yum的使用 5.设置系统字符集 6.vi & vim编辑 ...

  9. HSQLDB数据库使用详解(入门)及快速使用

    hsql数据库使用详解(入门)及快速使用 一.简介: hsql数据库是一款纯Java编写的免费数据库,许可是BSD-style的协议,如果你是使用Java编程的话,不凡考虑一下使用它,相对其 他数据库 ...

最新文章

  1. python编程试题定位列表元素的函数是_笨办法学Python 习题 34: 访问列表的元素
  2. C# 获取当前屏幕DPI
  3. SAP-SD计划行类别解析
  4. java rabbitmq topic_java rabbitmq 发送消息是topic模式, 消费者 怎么消费多个不同名字的队列?...
  5. java多线程系列13 设计模式 Future 模式
  6. android 调用系统短信接口开发,聚合数据Android SDK 短信api接口验证演示示例
  7. iOS通过iTunes search检测版本更新,并提示用户更新!
  8. 不同操作系统下重置root密码的方法
  9. mybatis自增主键回填
  10. java 计划任务_Java实现定时任务的几种方案
  11. 电气工程计算机网络基础知识大全,2018年注册电气工程师考试(电气与信息技术公共基础)知识点复习:计算机基础[网络体系结构与协议]...
  12. TCP协议-TCP服务特点和头部结构
  13. html5 canvas消除锯齿,HTML5 Canvas 如何取消反锯齿绘图
  14. python 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
  15. esp32 flash加密介绍
  16. 正则表达式-注册表验证
  17. 大数据毕设 - 校园卡数据分析与可视化(python 大数据)
  18. 解决Chrome 无法保存密码问题
  19. web免登钉钉微应用
  20. 新的篇章:来自鲍尔默和艾洛普的公开信

热门文章

  1. core 读取视图html,ASP.NET Core MVC 之视图(Views)
  2. 电脑清灰记录(惠普暗影精灵5)
  3. 浏览器指纹技术与浏览器指纹破解办法
  4. 小程序 配置域名 业务域名_使域名成为您的业务
  5. 达人评测 i5-1155g7和i5-1235u选哪个 i51155g7和1235u差距
  6. 水晶五笔下载地址(非技术)
  7. 手机开机卡在android画面,手机一直停在开机画面怎么解决【图文】
  8. 谈谈你对间隙锁的理解
  9. 网关——Zuul学习
  10. 从ICML 2022看域泛化(Domain Generalization)最新进展