GreenDao3.2的基本使用方法
前言
GreenDao是一款操作数据库的神器,经过了2.0版本的升级后,已经被广泛的开发者使用。确实是很好用,入门简单,可以剩去了数据库的建表操作和数据库SQL的编写,博主用了一次之后爱不释手,和以前的数据库操作一大堆的代码将它缩成了一句话,舒服.
GreenDao3.2的简介
认识GreenDao之前必须知道ORM(Object Relation Mapping对象关系映射),其表现形式就是通过GreenDao将数据库和Bean对象关联起来,其表现形式如下图
GreenDao之所以很流行,跟它的优点是息息相关的,从官网中可以看到这样一张图,其表示了在主流的ORM第三方库中,其对数据库操作的速度是最快的
不仅如此,其优点还包括有以下几点
存取速度快
支持数据库加密
轻量级
激活实体
支持缓存
代码自动生成
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对象的注释进行解释
@Entity:告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作
@Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值
@Property:可以自定义字段名,注意外键不能使用该属性
@NotNull:属性不能为空
@Transient:使用该注释的属性不会被存入数据库的字段中
@Unique:该属性值必须在数据库中是唯一值
@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中执行一次即可,这里对几个类进行解释
DevOpenHelper:创建SQLite数据库的SQLiteOpenHelper的具体实现
DaoMaster:GreenDao的顶级对象,作为数据库对象、用于创建表和删除表
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的基本使用方法相关推荐
- 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群
作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...
- Java面试题大全2021版
一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...
- GreenDao3.0 使用(包括导入,具体方法,基本使用,加密,数据库升级等)
关于GreenDao greenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案.关于greenDAO的概念可以看官网greenDAO greenDAO 优势 1.一个精简的库 ...
- greendao3.2.3配置时遇到的问题
这两天我一直在研究greendao这个框架,我在GitHub下载了 greendao3.2.2:https://github.com/greenrobot/greenDAO,照着网址里面来配置: // ...
- GreenDao2.2升级GreenDao3.0的适配之路
前言.为什么要升级到Greendao3.0? 1. 多人开发 以往的数据库建表建Dao等操作要新开一个module,在统一的地方管理数据库建表,现在可以直接写Entity.多人开发时自己管自己的Ent ...
- Android GreenDao3数据库升级,数据迁移
GreenDao3,当我们进行数据库版本升级的时候,会默认删除删除所有的表,然后重新创建 WARNING已经提示我们了,如果我们需求是在升级数据库之后保存当前的所有数据,则需要对onUpgrade( ...
- GreenDao3.0新特性解析(配置、注解、加密)
Greendao3.0release与7月6日发布,其中最主要的三大改变就是:1.换包名 2.实体注解 3.加密支持的优化 本文里面会遇到一些代码示例,就摘了官方文档和demo里的例子了,因为他们的例 ...
- 安卓轻量级数据库框架-GreenDao3.2.2集成方案
关于ORM的介绍 GreenDao概念 GreenDao设计目标和优点 GreenDao322的集成和使用 1 添加依赖 2 使用GreenDao3注解的语法来定义数据库实体类 定义实体类和主键ID等 ...
- 安卓本地轻量级数据库操作框架 greenDao3.2.2 详细教程附带Demo①——集成环境,开辟难题。
欢迎安卓本地轻量级数据库操作框架 greenDao3.2.2 学习之旅. 本套框架博客系列博客目录: 第一篇:认识 greenDao3.2.2 框架,集成环境,开辟难题. 第二篇:简单的进行 增.删. ...
最新文章
- python 反爬取数据
- 瞬发大量并发连接 造成MySQL连接不响应的分析
- Kubernetes 时代的安全软件供应链
- CSS文本超出2行就隐藏并且显示省略号
- 麟龙指标通达信指标公式源码_通达信指标公式源码单阳不破主图指标公式
- java web开发之 spring单元测试
- 亚马逊分类目录_新版亚马逊分类目录v2.4程序源码官方分享下载
- mysql 字符串 索引优化_轻松优化MySQL-之索引优化1
- Android setBackgroundResource无反应?
- 十进制转换为二进制数、八进制数和十六进制
- matlab软件安装码,Matlab2017a软件安装包以及安装教程
- 内核启动流程分析----内核启动
- appium for java教程_Java教程:Appium环境搭建
- tcpdf不支持html,TCPDF:无法从HTML输入生成PDF文件
- ADC的指标详细定义,SNR,以下内容无关: -------------------------------------------分割线----------------SNDR,SFDR,THD等
- Spring工作原理
- 电脑串口延迟/缓冲设置方法
- 三消游戏核心逻辑的一种实现
- processing软件使用python_Python processing学习
- RTKLIB进行伪距单点定位1——main函数