博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android ORM 框架:GreenDao 使用详解(基础篇)
阅读量:6442 次
发布时间:2019-06-23

本文共 5082 字,大约阅读时间需要 16 分钟。

转载务必保留以下信息:

本文作者:speedy
CSDN 专栏:
掘金专栏:

一、GreenDao 简介

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

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 地址:


三、核心类介绍

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 databases    compile '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 {    @Id    private long id;    private String name;    private int age;    //此处省略了getter,setter 方法}复制代码

2、点击 Make Project(或者 Make Moudle 'App') 编译一下工程 。如果配置正确,会在配置的包目录下自动会生成 DaoMaster,DaoSession 和 UserDao 类 。

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

4,获取 UserDao

MyApp myApp = (MyApp) getApplication();  DaoSession daoSession =  myApp.getDaoSession();  UserDao userDao = daoSession.getUserDao();复制代码

5, 保存记录

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

5, 删除记录

public void delete(User user){    userDao.delete(user);}复制代码

或者

public void deleteByUserId(long userid){     userDao.deleteByKey(1L);}复制代码

6,更新记录

public void update(User user){    userDao.update(user);}复制代码

7,查询记录

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)
@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

对应数据表中的 Id 字段

@Index

使用@Index作为一个属性来创建一个索引,默认是使用字段名

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

@Property

设置一个非默认关系映射所对应的列名,默认是使用字段名,例如:@Property(nameInDb = "userName")

@NotNull

设置数据库表当前列不能为空

@Transient

添加此标记后不会生成数据库表的列

@Unique

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

@Entitypublic class User {    @Id     private Long id;    @Unique    private 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

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

@Entitypublic class Customer {    @Id private Long id;    @ToMany(referencedJoinProperty = "customerId")    @OrderBy("date ASC")    private List orders;}@Entitypublic class Order {    @Id private Long id;    private Date date;    private long customerId;}复制代码

你可能感兴趣的文章
联合国隐私监督机构:大规模信息监控并非行之有效
查看>>
韩国研制出世界最薄光伏电池:厚度仅为人类头发直径百分之一
查看>>
惠普再“卖身”,软件业务卖给了这家鼻祖级公司
查看>>
软件定义存储的定制化怎么走?
查看>>
“上升”华为碰撞“下降”联想
查看>>
如何基于Spark进行用户画像?
查看>>
光伏发电对系统冲击大 “十三五”电力规划重点增强调峰能力
查看>>
全球19家值得关注的物联网安全初创企业
查看>>
Android下的junit 单元测试
查看>>
这几个在搞低功耗广域网的,才是物联网的黑马
查看>>
主流or消亡?2016年大数据发展将何去何从
查看>>
《大数据分析原理与实践》一一第3章 关联分析模型
查看>>
《挖掘管理价值:企业软件项目管理实战》一2.4 软件设计过程
查看>>
Capybara 2.14.1 发布,Web 应用验收测试框架
查看>>
ExcelJS —— Node 的 Excel 读写扩展模块2
查看>>
《数字短片创作(修订版)》——第一部分 剧本创作 第1章 数字短片创意技法 剧本创作的构思...
查看>>
MIT 学生挑战新泽西索取挖矿程序源代码的要求
查看>>
实践 | 不同行业WMS选型策略及需要注意的一些问题
查看>>
MaxCompute与OSS非结构化数据读写互通(及图像处理实例)
查看>>
【F3简介】一张图看懂FPGA-F3实例
查看>>