greenDAO3基本使用

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

导入相关的包

总工程下加入

dependencies
{
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0' //加上以下两行,引入greendao 3.0
compile 'org.greenrobot:greendao:3.0.1'
compile 'org.greenrobot:greendao-generator:3.0.0'
}

配置gradle

这一步非常关键,这是整个grennDAO3改变的核心所在了。

同样也是在总的工程目录下添加以下

apply plugin: 'org.greenrobot.greendao'  

buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
}
}

在gradle的根模块中加入上述代码后,sync project的时候,gradle会自动去maven仓库下载一个gradle的插件,当然了,这个插件就是为greenDAO服务的,用来生成数据库相关的代码。

下载起来会比较慢(网络不好),由于了这个插件,就不用再去新建一个java-lib去存放一些所生成的文件了,非常方便。

简单的介绍下通过gradle插件生成数据库代码的步骤:每次在make project之前,它会扫描项目中所有的@Entity文件(greenDAO中数据库的实体类),根据实体类生成DaoSession、DaoMaster以及所有实体类的dao类,生成的文件默认目录为:build/generated/source/greendao,当然也可以自行修改。

若不想修改生成的路径,可以将此路径设置为资源目录。我们也可以自定义这个路径,下面就来介绍如何在gradle中配置greenDAO的相关属性:

修改路径的方法:

在总的工程目录下添加以下代码:

greendao {
//指定数据库schema版本号,迁移等操作会用到
schemaVersion 1 //DaoSession、DaoMaster以及所有实体类的dao生成的目录,默认为你的entity所在的包名
//daoPackage 包名
daoPackage 'com.greendaodemo.greendao.gen' //这就是我们上面说到的自定义生成数据库文件的目录了,可以将生成的文件放到我们的java目录中,而不是build中,这样就不用额外的设置资源目录了
//工程路径
targetGenDir 'src/main/java'
}

所以最后代码生成的位置是 src/main/java/greendaodemo/greendao/gen


有以下参数可以选择

schemaVersion:数据库架构的当前版本。这是使用的 * OpenHelpers类模式版本之间迁移。如果你改变你的实体/数据库架构,这个值必须增加。默认为1。

daoPackage:用于生成的DAO,DaoMaster和DaoSession包名称。 默认为源实体的包名。

targetGenDir:其中,生成源应保存在该位置。 默认为构建目录里面生成的源文件夹( build / generated / source / greendao )。

generateTests: 设置为true,自动生成单元测试。

targetGenDirTests: 在哪里产生的单元测试应该被存储在基本目录。默认为 SRC / androidTest / java的。

编写entity类

//@Entity 将我们的java普通类变为一个能够被greenDAO识别的数据库类型的实体类
@Entity
public class User { //@Id:通过这个注解标记的字段必须是Long类型的,这个字段在数据库中表示它就是主键,并且它默认就是自增的
@Id
private Long id; private String name; //普通字段 //@Transient:表明这个字段不会被写入数据库,只是作为一个普通的java类字段,用来临时存储数据的,不会被持久化
@Transient
private int tempUsageCount; // not persisted
}

编译一下(Build->Make Project)

make完成之后会发现我们的User类中突然多了好多代码,这就是greenDAO自动为你生成的代码。这时就会多了get、set方法,以及构造函数(无参、有参),同时发现src/main/java/greendaodemo/greendao/gen下多了DaoSession、DaoMaster以及所有实体类的dao,之后所有相关的数据库操作都依靠这三个文件了。


@Id注解选择 long / Long 属性作为实体ID。在数据库术语中,它是主键。参数自动增量,是使ID值不断增加(不会选用旧值)的标志。

@Property让你定义一个非默认的列名,其属性映射到。如果不存在,greenDAO将在SQL杂交方式使用字段名(大写,下划线,而不是骆驼情况下,例如 customName将成为 CUSTOM_NAME)。注意:您目前只能使用内联常量来指定列名。

@NotNull makes the property a “NOT NULL” column on the database side。通常是有意义的纪念原始类型(long, int, short, byte)与@NotNull,同时具有包装类(Long, Integer, Short, Byte)空的值。

@Transient表明这个字段不会被写入数据库,只是作为一个普通的java类字段,用来临时存储数据的,不会被持久化

@Entity 定义实体

@nameInDb 在数据库中的名字,如不写则为实体中类名

@indexes 索引

@createInDb 是否创建表,默认为true,false时不创建

@schema 指定架构名称为实体

@active 无论是更新生成都刷新

@Id

@NotNull 不为null

@Unique 唯一约束

@ToMany 一对多

@OrderBy 排序

@ToOne 一对一

@Transient 不存储在数据库中

@generated 由greendao产生的构造函数或方法


数据库侧的表和列名称派生自实体和属性名称。 而不是在Java中使用的骆驼案例样式,默认数据库名称使用大写,使用下划线分隔单词。

例如name在数据库中显示NAME,creationDate 显示CREATION_DATE

用法(增删改查操作)

1.初始化数据库

DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(MyApplication.getContext(), "user-db", null);
DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());
DaoSession daoSession = daoMaster.newSession();
UserDao userDao = daoSession.getUserDao();

1. user-db是数据库名字(可以修改成别的,因为本来就不存在),应为我们之前创建了一个Entity叫做User,所以greenDAO自定帮我们生成的UserDao,拿到了这个UserDao,我们就可以操作User这张表了。

2. 一个DaoMaster就代表着一个数据库的连接;DaoSession可以让我们使用一些Entity的基本操作和获取Dao操作类,DaoSession可以创建多个,每一个都是属于同一个数据库连接的。


DaoMaster:使用greenDAO的切入点。 DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的DAO类(而不是对象)。它有静态方法来创建表或删除它们。它的内部类OpenHelper和DevOpenHelper是SQLiteOpenHelper实现,在SQLite数据库中创建模式。

DaoSession:管理特定模式的所有可用DAO对象,您可以使用其中一个getter方法获取。 DaoSession还为实体提供了一些通用的持久性方法,如插入,加载,更新,刷新和删除。最后,DaoSession对象也跟踪标识范围。

DAO:数据访问对象(DAO)持续并查询实体。对于每个实体,greenDAO生成DAO。它具有比DaoSession更多的持久化方法,例如:count,loadAll和insertInTx。

实体:持久对象。通常,实体是使用标准Java属性(如POJO或JavaBean)表示数据库行的对象。

2.插入数据

操作都是基于对象的了

//新建一个对象
User user = new User(null, "001");
//插入
userDao.insert(user);

3.查找数据

List<User> userList = userDao.queryBuilder()
.where(UserDao.Properties.Id.notEq(999))
.orderAsc(UserDao.Properties.Id)
.limit(5)
.build().list();

queryBuilder()方法,生成一个查找构造器,可以给构造器添加where条件判断、按照某某字段排序以及查询的条数等基本的数据库操作。list()方法表示查询的结果为一个集合.上述代码查询的就是ID号不等于999,按升序排序,做多5条,返回List类型

list()所有实体被加载到内存中。其结果通常是一个 ArrayList中,最容易使用。

listLazy()实体被装入点播存储器。一旦列表中的一个元素被首次访问,它被加载并高速缓存以供将来使用。必须关闭。

listLazyUncached()一个“虚拟”实体名单:任何接触到从数据库加载其数据的列表元素的结果。必须关闭。

ListIterator()通过懒加载的数据让你通过迭代的结果的。数据不会被缓存。必须关闭

方法 listLazy (), listLazyUncached (),和 的ListIterator ()利用greenDAO的的LazyList类。要加载按需数据,它保存到数据库游标的引用。这是你必须确保关闭惰性列表和迭代器(通常在try / finally块)的原因。

查找单一个对象

User user = userDao.queryBuilder()
.where(UserDao.Properties.Id.eq(999)).unique();

在多线程执行查询

如果您在使用多线程查询,您必须调用 forCurrentThread ()得到一个Query实例当前线程。

原始查询

如果QueryBuilder的不提供你所需要的,有执行原始SQL仍返回实体对象的两种方法。

第一,优选的方法是使用的QueryBuilder和 WhereCondition 。StringCondition。

有了这个,你可以传递任何SQL片段作为WHERE子句查询生成器。

例如:

Query query = userDao.queryBuilder().where(
new StringCondition("_ID IN " +
"(SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)")
).build();

第二种方法是使用 queryRaw或 queryRawCreate方法。

它们允许你通过原始SQL字符串,这是SELECT和实体列后面。通过这种方式,你可以有任何WHERE和ORDER BY要选择实体条款。实体表可以被称为使用别名。

Query query = userDao.queryRawCreate
(", GROUP G WHERE G.NAME=?
AND T.GROUP_ID=G._ID", "admin");

4.修改数据

//1.where是查询条件,
//2.unique()表示查询结果为一条数据,若数据不存在,findUser为null。
User findUser = userDao.queryBuilder().where(UserDao.Properties.Name.eq("wyk")).build().unique();
if(findUser != null) {
findUser.setName(newName);
// update为更新
userDao.update(findUser);
Toast.makeText(MyApplication.getContext(), "修改成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MyApplication.getContext(), "用户不存在", Toast.LENGTH_SHORT).show();
}

5.删除数据

User findUser = userDao.queryBuilder().where(UserDao.Properties.Name.eq("wyk")).build().unique();
if(findUser != null){
//通过Key来删除,这里的Key就是user字段中的ID号
userDao.deleteByKey(findUser.getId());
}

greenDAO3 基本使用的更多相关文章

  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.2的简单使用

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

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

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

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

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

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

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

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

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

  8. GreenDao3.2的使用

    原文:http://blog.csdn.net/qq_30379689/article/details/54410838 GreenDao3.2的使用,爱不释手 本篇文章包括以下内容: 前言 Gree ...

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

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

随机推荐

  1. http请求,普通的get和post方法

    在http://www.cnblogs.com/ITtangtang/p/3968093.html的基础上封装了一下get和post请求的常用方法, 虽然很简单,也晒晒 import org.apac ...

  2. ES6 will change the way you write JS code.

    https://hacks.mozilla.org/2015/04/es6-in-depth-an-introduction/ Counting to 6 The previous editions ...

  3. P1041 传染病控制

    #include <bits/stdc++.h> using namespace std; const int maxn = 301; std::vector<int> son ...

  4. 出售一套Unity + Lua热更新框架代码

    出售一套Unity + Lua的客户端框架代码,功能有资源管理.网络通信.配置文件解析.热更新.文件读写.Lua加密揭秘.UI框架.打包工具.编辑器工具等,已经在多个实际项目(已上线)中使用.代码优雅 ...

  5. dup和dup2用法小结

    今天和同学探讨了一下关于重定向输出到文件的问题,其中需要用到dup和dup2函数,因此来小小的总结一下. 首先来man一下: dup直接返回一个新的描述符和原来的描述符一样代表同一个资源,描述符的值就 ...

  6. VS2012完全卸载与VS2013安装

    项目本来使用的是vs2012 Ultimate,也一直跟随ms的节奏安装了从1到4的update,但一些无法忍受的问题却一直没有解决: 1.偶尔出现要等待编辑器响应的情况: 2.偶尔输入了冒号也不会出 ...

  7. centos7 firewalld

    1.firewalld简介 firewalld是centos7的一大特性,最大的好处有两个: 1.支持动态更新,不用重启服务: 2.加入了防火墙的"zone"概念   firewa ...

  8. 日志管理-Log4net

    引言 log4net库是Apache log4j框架在Micorsoft.NET平台的实现,是一个帮组程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具.(百度百科) 实际项目中使用log ...

  9. PostgreSQL function examples

    warehouse_db=# CREATE TABLE warehouse_tbl(warehouse_id INTEGER NOT NULL,warehouse_name TEXT NOT NULL ...

  10. 转Windows Phone8.1 获取手机唯一识别码

    转:http://www.dotblogs.com.tw/martinlau17/archive/2014/07/21/146020.aspx 因小弟比較懶,上次不小心 清空了所有文章 現在重寫了XD ...