前言

GreenDao是一款操作数据库的神器,经过了2.0版本的升级后,已经被广泛的开发者使用。确实是很好用,入门简单,可以剩去了数据库的建表操作和数据库SQL的编写,博主用了一次之后爱不释手,和以前的数据库操作一大堆的代码将它缩成了一句话,舒服.

GreenDao3.2的简介

认识GreenDao之前必须知道ORM(Object Relation Mapping对象关系映射),其表现形式就是通过GreenDao将数据库和Bean对象关联起来,其表现形式如下图

GreenDao之所以很流行,跟它的优点是息息相关的,从官网中可以看到这样一张图,其表示了在主流的ORM第三方库中,其对数据库操作的速度是最快的

不仅如此,其优点还包括有以下几点

  1. 存取速度快

  2. 支持数据库加密

  3. 轻量级

  4. 激活实体

  5. 支持缓存

  6. 代码自动生成

GreenDao3.2的配置

GreenDao的配置很简单,不过需要注意的是,有些人按照正确的配置后却频频出错,个人也经历过,最后的原因是网络有问题。因为校园网的DNS服务很差,所以解析不到GreenDao的依赖网站

一、需要在工程(Project)的build.gradle中添加依赖

buildscript {repositories {jcenter()}dependencies {classpath 'com.android.tools.build:gradle:2.0.0'//GreenDao3依赖classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'}
}

二、在项目(Module)的build.gradle中添加依赖

apply plugin: 'com.android.application'
//使用greendaoapply plugin: 'org.greenrobot.greendao'android {compileSdkVersion 23buildToolsVersion "23.0.2"defaultConfig {applicationId "com.handsome.didi"minSdkVersion 14targetSdkVersion 23versionCode 1versionName "1.0"}//greendao配置greendao {//版本号,升级时可配置schemaVersion 1                             }buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}
}dependencies {compile fileTree(include: ['*.jar'], dir: 'libs')testCompile 'junit:junit:4.12'compile 'com.android.support:appcompat-v7:23.1.1'//greendao依赖compile 'org.greenrobot:greendao:3.2.0'
}

到这里就配置成功了

一、创建Bean对象(表名和字段名)

@Entity
public class Bean {/*** 表示为购物车列表*/public static final int TYPE_CART = 0x01;/*** 表示为收藏列表*/public static final int TYPE_LOVE = 0x02;/*** 不能用int*/@Id(autoincrement = true)private Long id;/*** 商品名称*/@Uniqueprivate String name;/***商品价格*/@Property(nameInDb = "price")private String price;/*** 已售数量*/private int sell_num;/*** 图标url*/private String image_url;/*** 商家地址*/private String address;/*** 商品列表类型*/private int type;
}

点击Build后make project后GreenDao会自动帮你生成get/set方法如下:

package com.tongseng.sqlitedemo.generate;import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Property;
import org.greenrobot.greendao.annotation.Unique;
import org.greenrobot.greendao.annotation.Generated;/*** com.tongseng.sqlitedemo.generate** @author Administrator* @date 2018/3/21*/
@Entity
public class Bean {/*** 表示为购物车列表*/public static final int TYPE_CART = 0x01;/*** 表示为收藏列表*/public static final int TYPE_LOVE = 0x02;/*** 不能用int*/@Id(autoincrement = true)private Long id;/*** 商品名称*/@Uniqueprivate String name;/***商品价格*/@Property(nameInDb = "price")private String price;/*** 已售数量*/private int sell_num;/*** 图标url*/private String image_url;/*** 商家地址*/private String address;/*** 商品列表类型*/private int type;@Generated(hash = 139605306)public Bean(Long id, String name, String price, int sell_num, String image_url,String address, int type) {this.id = id;this.name = name;this.price = price;this.sell_num = sell_num;this.image_url = image_url;this.address = address;this.type = type;}@Generated(hash = 80546095)public Bean() {}public Long getId() {return this.id;}public void setId(Long id) {this.id = id;}public String getName() {return this.name;}public void setName(String name) {this.name = name;}public String getPrice() {return this.price;}public void setPrice(String price) {this.price = price;}public int getSell_num() {return this.sell_num;}public void setSell_num(int sell_num) {this.sell_num = sell_num;}public String getImage_url() {return this.image_url;}public void setImage_url(String image_url) {this.image_url = image_url;}public String getAddress() {return this.address;}public void setAddress(String address) {this.address = address;}public int getType() {return this.type;}public void setType(int type) {this.type = type;}
}

这里需要注意的是,创建完成之后,需要build gradle来完成我们的代码自动生成。自动生成的代码有

1. Bean实体的构造方法和get、set方法

2. DaoMaster、DaoSession、DAOS类

这里对Bean对象的注释进行解释

  1. @Entity:告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作

  2. @Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值

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

  4. @NotNull:属性不能为空

  5. @Transient:使用该注释的属性不会被存入数据库的字段中

  6. @Unique:该属性值必须在数据库中是唯一值

  7. @Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改

二、创建数据库(数据库名)

数据库的表名和字段都建好了,下面差个数据库的创建,下面通过传统和GreenDao的比较来体验其优点

public class BaseApplication extends Application {private static DaoSession daoSession;@Overridepublic void onCreate() {super.onCreate();//配置数据库setupDatabase();}/*** 配置数据库*/private void setupDatabase() {//创建数据库shop.db"DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "shop.db", null);//获取可写数据库SQLiteDatabase db = helper.getWritableDatabase();//获取数据库对象DaoMaster daoMaster = new DaoMaster(db);//获取Dao对象管理者daoSession = daoMaster.newSession();}public static DaoSession getDaoInstant() {return daoSession;}
}

可以发现,GreenDao已经将我们的数据库创建缩成几句话,代码会自动将Bean对象创建成表,不再是传统的手写SQL语句。这里的数据库创建只需要在Application中执行一次即可,这里对几个类进行解释

  1. DevOpenHelper:创建SQLite数据库的SQLiteOpenHelper的具体实现

  2. DaoMaster:GreenDao的顶级对象,作为数据库对象、用于创建表和删除表

  3. DaoSession:管理所有的Dao对象,Dao对象中存在着增删改查等API

由于我们已经创建好了DaoSession和Bean的Bean对象,编译后会自动生成我们的BeanDao对象,可通过DaoSession获得

BeanDao dao = daoSession.getBeanDao();

这里的Dao(Data Access Object)是指数据访问接口,即提供了数据库操作一些API接口,可通过dao进行增删改查操作

三、数据库的增删改查

数据库的表名、字段、数据库都建好了,下面就通过GreenDao对数据库进行操作

public class LoveDao {/*** 添加数据,如果有重复则覆盖** @param shop*/public static void insertLove(Shop shop) {BaseApplication.getDaoInstant().getShopDao().insertOrReplace(shop);}/*** 删除数据** @param id*/public static void deleteLove(long id) {BaseApplication.getDaoInstant().getShopDao().deleteByKey(id);}/*** 更新数据** @param shop*/public static void updateLove(Shop shop) {BaseApplication.getDaoInstant().getShopDao().update(shop);}/*** 查询条件为Type=TYPE_LOVE的数据** @return*/public static List<Shop> queryLove() {return BaseApplication.getDaoInstant().getShopDao().queryBuilder().where(ShopDao.Properties.Type.eq(Shop.TYPE_LOVE)).list();}/*** 查询全部数据*/public static List<Shop> queryAll() {return BaseApplication.getDaoInstant().getShopDao().loadAll();}
}

效果很明显,GreenDao的封装更加短小精悍,语义明朗,下面对GreenDao中Dao对象其他API的介绍

  • 增加单个数据

    • getShopDao().insert(shop);

    • getShopDao().insertOrReplace(shop);

  • 增加多个数据

    • getShopDao().insertInTx(shopList);

    • getShopDao().insertOrReplaceInTx(shopList);

  • 查询全部

    • List< Shop> list = getShopDao().loadAll();

    • List< Shop> list = getShopDao().queryBuilder().list();

  • 查询附加单个条件

    • .where()

    • .whereOr()

  • 查询附加多个条件

    • .where(, , ,)

    • .whereOr(, , ,)

  • 查询附加排序

    • .orderDesc()

    • .orderAsc()

  • 查询限制当页个数

    • .limit()

  • 查询总个数

    • .count()

  • 修改单个数据

    • getShopDao().update(shop);

  • 修改多个数据

    • getShopDao().updateInTx(shopList);

  • 删除单个数据

    • getTABUserDao().delete(user);

  • 删除多个数据

    • getUserDao().deleteInTx(userList);

  • 删除数据ByKey

    • getTABUserDao().deleteByKey();

当然,看到其他博客的方法,也可以把对greenDAO的调用封装成为一个单例模式,方便调用。

ublic class GreenDaoManager {private DaoMaster mDaoMaster;private DaoSession mDaoSession;private static GreenDaoManager mInstance; //单例private GreenDaoManager(){if (mInstance == null) {DaoMaster.DevOpenHelper devOpenHelper = newDaoMaster.DevOpenHelper(MyApplication.getContext(), "user1-db", null);//此处为自己需要处理的表mDaoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());mDaoSession = mDaoMaster.newSession();}}public static GreenDaoManager getInstance() {if (mInstance == null) {synchronized (GreenDaoManager.class) {//保证异步处理安全操作if (mInstance == null) {mInstance = new GreenDaoManager();}}}return mInstance;}public DaoMaster getMaster() {return mDaoMaster;}public DaoSession getSession() {return mDaoSession;}public DaoSession getNewSession() {mDaoSession = mDaoMaster.newSession();return mDaoSession;}
}

在Application中配置

public class BaseApplication extends Application {private static Context mContext;@Overridepublic void onCreate() {super.onCreate();mContext = getApplicationContext();//greenDao全局配置,只希望有一个数据库操作对象GreenDaoManager.getInstance();}public static Context getContext() {return mContext;}
}

下面为一些常用的注解使用方式:

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

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

@Id 标明主键,括号里可以指定是否自增

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

@NotNull 非空

@Transient 标识这个字段是自定义的不会创建到数据库表里

@Unique 添加唯一约束


关系注解:

@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 是将自己的一个属性与另一个表建立关联

@Entity
public class User {
    @Id private Long id;
  
    @ToMany(referencedJoinProperty = "ownerId")
    private List<Site> ownedSites;
}
  
@Entity
public class Site {
    @Id private Long id;
    private long ownerId;
}

// ----------------------------
@Entity
public class User {
    @Id private Long id;
    @Unique private String authorTag;
  
    @ToMany(joinProperties = {
            @JoinProperty(name = "authorTag", referencedName = "ownerTag")
    })
    private List<Site> ownedSites;
}
  
@Entity
public class Site {
    @Id private Long id;
    @NotNull private String ownerTag;
}
// ----------------------------

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

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

GreenDao3.2的基本使用方法相关推荐

  1. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群

    作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...

  2. Java面试题大全2021版

    一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...

  3. GreenDao3.0 使用(包括导入,具体方法,基本使用,加密,数据库升级等)

    关于GreenDao greenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案.关于greenDAO的概念可以看官网greenDAO greenDAO 优势 1.一个精简的库 ...

  4. greendao3.2.3配置时遇到的问题

    这两天我一直在研究greendao这个框架,我在GitHub下载了 greendao3.2.2:https://github.com/greenrobot/greenDAO,照着网址里面来配置: // ...

  5. GreenDao2.2升级GreenDao3.0的适配之路

    前言.为什么要升级到Greendao3.0? 1. 多人开发 以往的数据库建表建Dao等操作要新开一个module,在统一的地方管理数据库建表,现在可以直接写Entity.多人开发时自己管自己的Ent ...

  6. Android GreenDao3数据库升级,数据迁移

    GreenDao3,当我们进行数据库版本升级的时候,会默认删除删除所有的表,然后重新创建 WARNING已经提示我们了,如果我们需求是在升级数据库之后保存当前的所有数据,则需要对onUpgrade( ...

  7. GreenDao3.0新特性解析(配置、注解、加密)

    Greendao3.0release与7月6日发布,其中最主要的三大改变就是:1.换包名 2.实体注解 3.加密支持的优化 本文里面会遇到一些代码示例,就摘了官方文档和demo里的例子了,因为他们的例 ...

  8. 安卓轻量级数据库框架-GreenDao3.2.2集成方案

    关于ORM的介绍 GreenDao概念 GreenDao设计目标和优点 GreenDao322的集成和使用 1 添加依赖 2 使用GreenDao3注解的语法来定义数据库实体类 定义实体类和主键ID等 ...

  9. 安卓本地轻量级数据库操作框架 greenDao3.2.2 详细教程附带Demo①——集成环境,开辟难题。

    欢迎安卓本地轻量级数据库操作框架 greenDao3.2.2 学习之旅. 本套框架博客系列博客目录: 第一篇:认识 greenDao3.2.2 框架,集成环境,开辟难题. 第二篇:简单的进行 增.删. ...

最新文章

  1. python 反爬取数据
  2. 瞬发大量并发连接 造成MySQL连接不响应的分析
  3. Kubernetes 时代的安全软件供应链
  4. CSS文本超出2行就隐藏并且显示省略号
  5. 麟龙指标通达信指标公式源码_通达信指标公式源码单阳不破主图指标公式
  6. java web开发之 spring单元测试
  7. 亚马逊分类目录_新版亚马逊分类目录v2.4程序源码官方分享下载
  8. mysql 字符串 索引优化_轻松优化MySQL-之索引优化1
  9. Android setBackgroundResource无反应?
  10. 十进制转换为二进制数、八进制数和十六进制
  11. matlab软件安装码,Matlab2017a软件安装包以及安装教程
  12. 内核启动流程分析----内核启动
  13. appium for java教程_Java教程:Appium环境搭建
  14. tcpdf不支持html,TCPDF:无法从HTML输入生成PDF文件
  15. ADC的指标详细定义,SNR,以下内容无关: -------------------------------------------分割线----------------SNDR,SFDR,THD等
  16. Spring工作原理
  17. 电脑串口延迟/缓冲设置方法
  18. 三消游戏核心逻辑的一种实现
  19. processing软件使用python_Python processing学习
  20. RTKLIB进行伪距单点定位1——main函数

热门文章

  1. 考虑风光火储的微电网优化调度 考虑风电、光伏、热电机组和储能优化调度,其中负荷考虑冬季或夏季两种场景,并且考虑晴天、多云、雨天、多风和少风场景
  2. 英语听力采用计算机化考试,北京高考英语听力机考有什么特点?
  3. 剑指Offer and Leetcode刷题总结之常见策略(1):二分法
  4. 完成一条微指令四周期英文全称
  5. Thread.Sleep(0)的妙用
  6. 流水的新技术,铁打的Linux
  7. 端午福福福福福福福福福福福福福福福福利
  8. 多目标跟踪MOT入门
  9. SpringBoot监控
  10. MEMS电容式加速度传感器(简介)-传感器专题