原文:http://blog.csdn.net/qq_30379689/article/details/54410838

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'
//使用greendao
apply plugin: 'org.greenrobot.greendao' android {
compileSdkVersion 23
buildToolsVersion "23.0.2" defaultConfig {
applicationId "com.handsome.didi"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
//greendao配置
greendao {
//版本号,升级时可配置
schemaVersion 1
}
buildTypes {
release {
minifyEnabled false
proguardFiles 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'
}

到这里就配置成功了

GreenDao3.2的使用

配置完成后,最重要的就是GreenDao的使用了,或许使用过Bmob第三方后端云的同学会知道,他们的API有些相像,都是通过API来拼装SQL语句的

下面就以购物车的实战来使用GreenDao,这里的购物车展示图如下

我们所知道的数据库操作需要:数据库名、表名、字段名,缺一不可,下面就是这三项的创建

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

GreenDao需要创建Bean对象之后,该Bean对象就是表名,而它的属性值就是字段名,其实现是通过注释的方式来实现的,下面是购物车的Bean对象(每个Bean对象对应一张表)

@Entity
public class Shop{ //表示为购物车列表
public static final int TYPE_CART = 0x01;
//表示为收藏列表
public static final int TYPE_LOVE = 0x02; //不能用int
@Id(autoincrement = true)
private Long id;
//商品名称
@Unique
private String name;
//商品价格
@Property(nameInDb = "price")
private String price;
//已售数量
private int sell_num;
//图标url
private String image_url;
//商家地址
private String address;
//商品列表类型
private int 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 CommonOpenHelper extends SQLiteOpenHelper {

    private static CommonOpenHelper helper;

    public static CommonOpenHelper getInstance(Context context) {
if (helper == null) {
helper = new CommonOpenHelper(context, "common.db", null, 1);
}
return helper;
} private CommonOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
} @Override
public void onCreate(SQLiteDatabase db) {
//创建love表
db.execSQL("create table love(" +
"id integer primary key autoincrement, " +
"name varchar, " +
"price varchar, " +
"sell_num integer, " +
"image_url varchar, " +
"address varchar" +
")");
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
}

② GreenDao数据库创建

public class BaseApplication extends Application {

    private static DaoSession daoSession;

    @Override
public 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和Shop的Bean对象,编译后会自动生成我们的ShopDao对象,可通过DaoSession获得

ShopDao dao = daoSession.getShopDao();
  • 1

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

三、数据库的增删改查

数据库的表名、字段、数据库都建好了,下面就通过传统和GreenDao对数据库的操作来比较体验其优点

① 传统的增删改查

/**
* 采用ContentProvider进行增删改查
*/
public class CartDao { /**
* 添加数据
*
* @param resolver
* @param shop
* @return
*/
public static boolean insertCart(ContentResolver resolver, Shop shop) {
ContentValues values = new ContentValues();
values.put("name", shop.getName());
values.put("price", shop.getPrice());
values.put("sell_num", shop.getSell_num());
values.put("image_url", shop.getImage_url());
values.put("address", shop.getAddress());
resolver.insert(MyCartProvider.URI.CODE_CART_INSERT, values);
BaseApplication.getDaoInstant().getShopDao().insert(shop);
return true;
} /**
* 删除数据
*
* @param resolver
* @param id
*/
public static void deleteCart(ContentResolver resolver, int id) {
resolver.delete(MyCartProvider.URI.CODE_CART_DELETE, "id = " + id, null);
} /**
* 查询数据
*
* @param resolver
* @return
*/
public static List<Shop> queryCart(ContentResolver resolver) {
List<Shop> list = new ArrayList<Shop>();
String[] projection = {"id", "name", "price", "sell_num", "image_url", "address"};
Cursor cursor = resolver.query(MyCartProvider.URI.CODE_CART_QUERY, projection, null, null, null);
while (cursor.moveToNext()) {
Shop shop = new Shop();
shop.setId(cursor.getLong(cursor.getColumnIndex("id")));
shop.setName(cursor.getString(cursor.getColumnIndex("name")));
shop.setPrice(cursor.getString(cursor.getColumnIndex("price")));
shop.setSell_num(cursor.getInt(cursor.getColumnIndex("sell_num")));
shop.setImage_url(cursor.getString(cursor.getColumnIndex("image_url")));
shop.setAddress(cursor.getString(cursor.getColumnIndex("address")));
list.add(shop);
}
return list;
} /**
* 省略更新数据
*/
}

② 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的的基本概念与基本操作就讲到这里,更多对于GreenDao的数据库操作还需要多多从实战中去探索,这里只是一个快速入门的引导.GreenDao高级操作还包括有:多表查询、多表关联、session缓存等用法,可以到GreenDao的官网进行学习

Github:GreenDaoDemo

 

GreenDao3.2的使用的更多相关文章

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

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

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

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

  3. greenDAO3 基本使用

    greenDAO3基本使用 greenDAO3开始使用注解的方式定义实体类(entity),并且是通过安装gradle插件来生成代码.之前的版本则是通过建立一个独立的Java-lib工程来存放生成的文 ...

  4. GreenDao3.2的简单使用

    Android -- GreenDao3.2的简单使用http://www.cnblogs.com/wjtaigwh/p/6394288.html https://github.com/greenro ...

  5. GreenDao3.0简单使用(转)

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

  6. Android数据库框架-----GreenDao3的相关使用和版本升级更新

    GreenDAO是一款非要流行的Android平台上的数据库框架,性能优秀,代码简洁:是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案. GreenDAO 优势 1.一个精简的库 2 ...

  7. Android框架之路——GreenDao3.2.2的使用

    一.简介 GreenDAO是一个开源的安卓ORM框架,能够使SQLite数据库的开发再次变得有趣.它减轻开发人员处理低级数据库需求,同时节省开发时间. SQLite是一个令人敬畏的内嵌的关系数据库,编 ...

  8. android greendao3.0 多表关联关系讲解(转)

    转自:http://www.jianshu.com/p/dbec25bd575f 前言 之前用过数据库框架:realm.kjdb,今天准备实践学习一下greendao 3.0.greendao 3.0 ...

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

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

随机推荐

  1. 基于WinDbg的内存泄漏分析

    在前面C++中基于Crt的内存泄漏检测一文中提到的方法已经可以解决我们的大部分内存泄露问题了,但是该方法是有前提的,那就是一定要有源代码,而且还只能是Debug版本调试模式下.实际上很多时候我们的程序 ...

  2. python optparse模块的简单用法

    # coding = utf-8 from optparse import OptionParser from optparse import OptionGroup usage = 'Usage: ...

  3. TypeScript完全解读(26课时)_20.声明文件

    首先学习识别已有的js库的类型 识别已有的js库的类型 UMD既可以作为全局库使用,也可以作为模块使用 先在着手来编写一个全局的库 新建文件 接收一个title,改变页面title的值 这里用到 &a ...

  4. myeclipse同时部署两个项目-permgen space

    黑色头发:http://heisetoufa.iteye.com/ 使用myeclipse启动两个SSH2的部署在tomcat6下的项目报出java.lang.OutOfMemoryError: Pe ...

  5. Python3.6 字典的内置方法

    1.dict.clear(self) 删除字典内所有元素 2.dict.copy(self) 返回一个字典的浅复制,拷贝父对象,不会拷贝对象的内部的子对象 3.dict.fromkeys(self,  ...

  6. CSS3 制作魔方 - 形成魔方

    道路千万条,安全第一条! 魔方结构解析 从魔方的外观来看,可以有多种方式来表达它的组成,从而也有多种方式来形成一个魔方.如: 由六个面组成 由若干层组成 由多个方块组成 无论哪种方式,都可以制作魔方. ...

  7. lightoj1060【康托逆展开】

    可以先看些资料:http://blog.csdn.net/keyboarderqq/article/details/53388936 参考谷巨巨:http://blog.csdn.net/azx736 ...

  8. unity2d 动画

    1 资源test.jpg(如下)放入Resources文件夹 2 切割图片 点击图片,在inspector中,选择Texture Type为Sprite(2D and UI),然后点击Sprite E ...

  9. [Xcode 实际操作]九、实用进阶-(28)在iTunes Connect(苹果商店的管理后台)中创建一个新的新的APP

    目录:[Swift]Xcode实际操作 本文将演示如何在iTunes Connect(苹果商店的管理后台)中创建一个新的新的APP. 首先要做的是打开浏览器,并进入[iTunesConnect网站], ...

  10. UITableView以及cell属性

    在ios的UI中UITableView是个常用且强大的控件 基本使用: 1>设置代理,一般把控制器设为代理:self.tableView.delegate = self; 2>遵守代理的协 ...