CRUD

增加:

dao.insert(Student entity);//添加一个
dao.insertInTx(Student... entity);//批量添加

删除:

dao.deleteByKey(Long key);//根据主键删除
dao.deleteByKeyInTx(Long... keys);//批量删除
dao.delete(Student entity);//根据实体删除
dao.deleteInTx(Student... entities);//批量删除
dao.deleteAll();//全部删除

修改:

dao.update(Student entity);//根据实体更新
dao.updateInTx(Student... entities);//批量更新

查找:

Query<Student> query = dao.queryBuilder().where(StudentDao.Properties.Name.eq(content)).build();
List<Student> list = query.list();
//或者利用sql语言查询
Query query = dao.queryBuilder().where( new StringCondition("_ID IN " + "(SELECT _ID FROM STUDENT WHERE AGE = 20)").build()

创建属性约束

我们可以在为Schema添加实体的时候,在实体添加属性时候进行属性的一些约束,如:

Schema schema = new Schema(1,"com.sunzxyong.greendao");
Entity entity = schema.addEntity("Student");
entity.addIdProperty().autoincrement().primaryKey();
entity.addStringProperty("name").notNull();
entity.addIntProperty("age");
entity.addBooleanProperty("is_man").notNull();
new DaoGenerator().generateAll(schema,"../GreenDAODemo/app/src/main/java-gen");

实体类的继承、接口、序列化

entity.implementsSerializable();//实现序列化
entity.implementsInterface("com.sunzxyong.A");//实现A接口
entity.setSuperclass("com.sunzxyong.B");//继承B类
entity.addImport("com.sunzxyong.C");//导包

保持实体中自定义的代码不会被覆盖

假如你需要在实体类中自定义一些字段变量和方法,而再次generator的实体类通常会覆盖以前的,如果你不想覆盖掉你自定义的代码,可以这样设置:

schema.enableKeepSectionsByDefault();//通过次Schema对象添加的所有实体都不会覆盖自定义的代码
//或者
entity.setHasKeepSections(true);//单独让某个实体不覆盖自定义的代码

如果设置了上述代码,则生成的实体中会多出以下代码:

// KEEP INCLUDES - put your custom includes here
在这里添加引入
// KEEP INCLUDES END 

// KEEP FIELDS - put your custom fields here
在这里添加字段变量
// KEEP FIELDS END 

// KEEP METHODS - put your custom methods here
在这里添加方法
// KEEP METHODS END

【注意】:添加的自定义代码只能在我用文字标注的地方添加,否则超过次区域的GreenDAO生成实体时将会覆盖

多线程环境下使用GreenDAO

在多线程的环境下使用查询,你必须调用query的 forCurrentThread()为当前的线程获得一个query实例,如:

Query<Student> query = dao.queryBuilder().where(StudentDao.Properties.Name.eq(content)).build().forCurrentThread();
List<Student> list = query.list();

LazyList和List

在通过queryBuilder建立查询时候:

1、如果你想得到一个唯一的结果,可以调用Query的unique()方法,如:

Query<Student> query = dao.queryBuilder().where(StudentDao.Properties.Name.eq(content)).build().forCurrentThread();
Student student = query.unique();

2、如果你想得到多个结果,可以调用Query的list()或者listLazy()方法,这两个方法有什么区别呢?

  1. List - 当所有的实体查询完会立即一次性加载到内存中,即在List集合中
  2. LazyList - 懒加载的方式,即实体按照需求加载进入内存(查询完不会立即加载到内存中,只有在需要数据的时候也就是遍历这个LazyList的时候,才会加载到内存中),列表中的元素在第一次访问时候就会同时缓存在一个ArrayList集合中,它再次访问这些元素则直接从集合中拿。如果你不想缓存这些数据又想懒加载,可以通过Query的listLazyUncached()方法。这个集合在使用完毕必须close,即调用:listLazy.close();

GreenDao的代码混淆配置

-keepclassmembers class * extends de.greenrobot.dao.AbstractDao {
    public static java.lang.String TABLENAME;
}
-keep class **$Properties

借助两个Flag打印出SQL命令和传入的值

通过设置这两个Flag,可以在控制台中打印出我们执行的sql语句以及传入的值,方便用于检查

//下面两个Flag的设置可以在控制台中打印出此次查询的sql语句和value值
QueryBuilder.LOG_SQL = true;
QueryBuilder.LOG_VALUES = true;
Query<Student> query = dao.queryBuilder().where(StudentDao.Properties.Name.eq(content)).build().forCurrentThread();
LazyList<Student> list = query.listLazyUncached();

ORM对象关系映射之GreenDAO高级用法的更多相关文章

  1. ORM对象关系映射之GreenDAO源码解析

    上一篇我们学习了GreenDAO的CRUD基本操作,可以说是非常的方便的,而且GreenDAO的效率和性能远远高于其它两款流行的ORM框架,下面是我从官网找的一副它们三个ORM框架之间的性能测试的直观 ...

  2. ORM对象关系映射之GreenDAO建立多表关联

    利用GreenDAO可以非常方便的建立多张表之间的关联 一对一关联 通常我们在操作数据库的时候,我们往往不是单独的对一张表进行操作,而是对这张表的操作会联动的影响另外一张表或者多张表,比如:现在有两张 ...

  3. Android ORM对象关系映射之GreenDAO建立多表关联

    https://blog.csdn.net/u010687392/article/details/48496299 利用GreenDAO可以非常方便的建立多张表之间的关联 一对一关联 通常我们在操作数 ...

  4. ORM对象关系映射之GreenDAO自定义属性转换器PropertyConverter

    在使用GreenDAO定义实体的属性时候,通常来说定义的实体属性名就是对应的表的字段名.实体中属性的类型(如Long.String等)就是表的字段名类型,但是我们难免会有不一样的需求,比如实体中我定义 ...

  5. ORM 对象关系映射

    ORM (object relation mapping) 就是将对象数据转换为sql语句并执行 对象关系映射框架 orm 需要做的事情 1 生成创建表的语句 2 插入数据的语句 3 删除数据的语句 ...

  6. Django---静态文件配置,post提交表单的csrf问题(日后细说),创建app子项目和分析其目录,ORM对象关系映射简介,Django操作orm(重点)

    Django---静态文件配置,post提交表单的csrf问题(日后细说),创建app子项目和分析其目录,ORM对象关系映射简介,Django操作orm(重点) 一丶Django的静态文件配置 #we ...

  7. Php ORM 对象关系映射

    ORM的全称是Object Relational Mapping,即对象关系映射.它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,并通过面向对象(Object-Oriented)的方式将 ...

  8. $Django setting.py配置 ,GET、POST深入理解,三件套,orm对象关系映射简介

    1 django中app的概念: 大学:----------------- 项目  信息学院 ----------app01  物理学院-----------app02 ****强调***:创建的每一 ...

  9. ORM对象关系映射

    ORM 总结: ORM:对象关系映射 作用: 1.将定义数据库模型类--> 数据库表 2.将定义数据库模型类中的属性--->数据库表字段 3.将模型对象的操作(add,delete,com ...

随机推荐

  1. Linux下文件的mtime/atime/ctime研究

    概述 在Linux下,对于某一个文件或文件夹时间的描述有三种:文件修改时间mtime,文件访问时间atime,文件状态改变时间ctime.在Linux下无法获取到文件的创建时间,因为根本就没有保存这个 ...

  2. Linux 中交换空间 (swap)应该分多大才好?

    前一段时间,我们机房中一台Linux服务器运行缓慢,系统服务出现间歇性停止响应,让我过去处理一下这一问题,登录到服务器之后,发现此服务器的物理内存是16G,而最初装机的时候,系统管理人员却只分配了4G ...

  3. Swift基础之Demo包含刷新,加载,网络请求,MVC

    Swift中有一个Alamofire第三方是进行网络请求的,它是AFNetworking的作者写的Swift形式,今天先介绍一下,利用pod导入AFNetworking,SVProgressHUD,M ...

  4. 全文检索Lucene (2)

    接着全文检索Lucene (1) . 下面我们来深入的研究一下,如何使用Lucene! 从全文检索Lucene (1)中我们可以看出,Lucene就好比一个双向的工作流,一方面是对索引库的维护,另一方 ...

  5. Dynamics CRM2013 用户进入系统所必需的那些权限

    本篇以CRM2013为例,在CRM中新建一个安全角色后该安全角色基本是空的,如果新建的安全角色作为一个账号的唯一安全角色时,那这个安全角色除了需要配置业务场景所需的权限外,是要优先具备进入CRM系统的 ...

  6. 指令汇B新闻客户端开发(六) 浅谈屏幕适配解决方案

    屏幕适配的问题,我相信很多大牛的经验远比我丰富,在此就简单的分享一下我所做的的屏幕适配方案,当然我说的是安卓方面的啦,嘿嘿,屏幕适配我们一般用1280*720的屏幕作为我们的主流开发屏,当然现在And ...

  7. [virtualenv]生产环境中使用virtualenv

    virtualenv 对于python开发和部署都是好工具,可以隔离多个python版本和第三方库的版本,这里作者总结了几个常用python服务怎么样结合virtual部署 原文链接 Python 中 ...

  8. Java并发框架——AQS阻塞队列管理(一)——自旋锁

    我们知道一个线程在尝试获取锁失败后将被阻塞并加入等待队列中,它是一个怎样的队列?又是如何管理此队列?这节聊聊CHL Node FIFO队列. 在谈到CHL Node FIFO队列之前,我们先分析这种队 ...

  9. Transform介绍(Unity3D开发之二)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=491 可能unity中接触较早的 ...

  10. android AlarmManager讲解

    Android系统闹钟定时功能框架,总体来说就是用数据库存储定时数据,有一个状态管理器来统一管理这些定时状态的触发和更新.在Andriod系统中实现定时功能,最终还是要用到系统提供的AlarmMana ...