前言

在 Android ORM 框架:GreenDao 使用详解(基础篇) 中,我们了解了 GreenDao 的基本使用,本文我们将深入讲解 GreenDao 的使用 。

一、复杂表结构

a, 使用 @ToOne 建立一对一 ( 1 : 1) 关系

@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;

}

b,使用 @ToMany 建立一对多 (1:N ) 关系

@Entity

public class Customer {

@Id

private Long id;

@ToMany(referencedJoinProperty = "customerId")

@OrderBy("date ASC")

private List orders;

}

@Entity

public class Order {

@Id private Long id;

private Date date;

private long customerId;

}

c, 使用@JoinEntity 建立多对多(N : M)关系

@Entity

public class Product {

@Id private Long id;

@ToMany

@JoinEntity(

entity = JoinProductsWithOrders.class,

sourceProperty = "productId",

targetProperty = "orderId"

)

private List ordersWithThisProduct;

}

@Entity

public class JoinProductsWithOrders {

@Id private Long id;

private Long productId;

private Long orderId;

}

@Entity

public class Order {

@Id private Long id;

}

二、自定义类型

1,GreenDao 默认支持的类型有

boolean, Boolean

int, Integer

short, Short

long, Long

float, Float

double, Double

byte, Byte

byte[]

String

Date

2,通过 @Convert 注解转换数据类型

例如:将枚举类型转换成整形

@Entity

public class User {

@Id

private Long id;

@Convert(converter = RoleConverter.class, columnType = Integer.class)

private Role role;

public enum Role {

DEFAULT(0), AUTHOR(1), ADMIN(2);

final int id;

Role(int id) {

this.id = id;

}

}

public static class RoleConverter implements PropertyConverter {

@Override

public Role convertToEntityProperty(Integer databaseValue) {

if (databaseValue == null) {

return null;

}

for (Role role : Role.values()) {

if (role.id == databaseValue) {

return role;

}

}

return Role.DEFAULT;

}

@Override

public Integer convertToDatabaseValue(Role entityProperty) {

return entityProperty == null ? null : entityProperty.id;

}

}

三、复杂查询

a, 条件查询

方法一:

List joes = userDao.queryRaw("where AGE>?","10");//查询年龄大于10的用户

方法二:

List joes = userDao.queryBuilder().where(UserDao.Properties.Age.gt("10")).list();

b, 排序

// order by last name

queryBuilder.orderAsc(Properties.LastName);

// in reverse

queryBuilder.orderDesc(Properties.LastName);

// order by last name and year of birth

queryBuilder.orderAsc(Properties.LastName).orderDesc(Properties.YearOfBirth);

c, 分页

limit(int) : 限制查询返回的结果的数量。

offset(int): 设置起始位置

// 从第二条记录开始查询5条记录

List list = userDao.queryBuilder()

.offset(2)

.limit(5)

.list();

d, 懒加载

LazyList lazyList = userDao.queryBuilder().listLazy();

for (User u:lazyList) {

Log.i(TAG, "用户名:"+u.getName());

}

lazyList.close(); //不再使用时必须关闭,否则会导致数据库游标未关闭,从而导致内存泄漏

LazyList 是 GreenDao 实现的集合类,实现了 List 接口,所以,直接把 LazyList 当做List 来使用即可,

public class LazyList implements List, Closeable {

//省略了具体实现

}

注意: LazyList 不再使用时必须调用用 close() 方法关闭,否则会导致内存泄漏 。

lazyList.close();

e, 故障查询

很多时候我们在查询的时候不能查询到我们期望的结果,这个时候我们可以通过修改 QueryBuilder 的两个静态成员变量来打印 SQL 日志,便于排查问题。

QueryBuilder.LOG_SQL = true;

QueryBuilder.LOG_VALUES = true;

f, 多表联合查询

QueryBuilder queryBuilder = userDao.queryBuilder();

queryBuilder.join(Address.class, AddressDao.Properties.userId)

.where(AddressDao.Properties.Street.eq("Sesame Street"));

List users = queryBuilder.list();

四、混淆配置

### greenDAO 3

-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {

public static java.lang.String TABLENAME;

}

-keep class **$Properties

# If you do not use SQLCipher:

-dontwarn org.greenrobot.greendao.database.**

# If you do not use RxJava:

-dontwarn rx.**

### greenDAO 2

-keepclassmembers class * extends de.greenrobot.dao.AbstractDao {

public static java.lang.String TABLENAME;

}

-keep class **$Properties

五、数据库加密

greenDAO 支持 SQLCipher 直接绑定。

a, 引入依赖:

compile 'net.zetetic:android-database-sqlcipher:[email protected]'

b, 初始化加密数据库

DevOpenHelper helper = new DevOpenHelper(this, "notes-db-encrypted.db");

Database db = helper.getEncryptedWritableDb("");

daoSession = new DaoMaster(db).newSession();

c、其他操作和未加密一样(是不是特别简单)

当然,如果你不是使用 GreenDao 数据库,同样可以使用 SQLCipher 加密保护我们的数据,详细请参考 SQLCipher for Android

六,整合 RxJava

Rxjava 的火爆程度已经是如日中天了,GreenDao 对当然也是对提供对 Rxjava 的支持。(比较失望的是目前 GreedDao 仅支持 Rxjava 1,不支持 Rxjava 2)

1,引入 Rxjava 依赖

compile 'io.reactivex:rxandroid:1.2.1'

compile 'io.reactivex:rxjava:1.2.9'

3,初始化 GreedDao 配置

public class App extends Application {

/**

* 加密标识符

*/

public static final boolean ENCRYPTED = true;

private DaoSession daoSession;

@Override

public void onCreate() {

super.onCreate();

DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this,ENCRYPTED ? "notes-db-encrypted" : "notes-db");

Database db = ENCRYPTED ? helper.getEncryptedWritableDb("super-secret") : helper.getWritableDb();

daoSession = new DaoMaster(db).newSession();

}

public DaoSession getDaoSession() {

return daoSession;

}

}

3, 获取 RxDao

User user = new User();

user.setUserId(10);

user.setName("小红");

user.setAge(18);

DaoSession daoSession = ((MyApp) getApplication()).getDaoSession();

RxDao userDao = daoSession.getUserDao().rx();

userDao.insert(user)

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Action1() {

@Override

public void call(User user) {

Log.i(TAG, "保存成功 ");

}

});

androidentity什么用_Android ORM 框架:GreenDao 使用详解(进阶篇)相关推荐

  1. android 连接mysql orm_Android ORM框架 GreenDao 的使用详解

    一.前言 关于 Android 中常用的数据存储方式我们前面已经讲了 Sp 存储和文件存储,但是对于数据量比较大,并且结构复杂的数据我们想要存储只能通过数据库进行处理,Android 中提供了一个 S ...

  2. Android ORM框架GreenDao用法

    Android ORM框架GreenDao用法 0 简介 android 上的ORM框架主要有两个:ormlite 和 GreenDAO,本篇主要介绍GreenDao的用法,原因是GreenDAO的速 ...

  3. Android ORM框架 GreenDao 的使用详解

    一.前言 关于 Android 中常用的数据存储方式我们前面已经讲了 Sp 存储 和 文件存储,但是对于数据量比较大,并且结构复杂的数据我们想要存储只能通过数据库进行处理,Android 中提供了一个 ...

  4. GreenDao 使用详解(入门篇)

    Android ORM 框架:GreenDao 使用详解 最近太忙了,直接引用网上的图片 一.GreenDao 简介 greenDAO 是一款开源的面向 Android 的轻便.快捷的 ORM 框架, ...

  5. spring框架 AOP核心详解

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

  6. pythonmessage用法_django 消息框架 message使用详解

    前言 在网页应用中,我们经常需要在处理完表单或其它类型的用户输入后,显示一个通知信息给用户. 对于这个需求,Django提供了基于Cookie或者会话的消息框架messages,无论是匿名用户还是认证 ...

  7. 定时任务框架APScheduler学习详解

    定时任务框架APScheduler学习详解 APScheduler简介 在平常的工作中几乎有一半的功能模块都需要定时任务来推动,例如项目中有一个定时统计程序,定时爬出网站的URL程序,定时检测钓鱼网站 ...

  8. java集合框架的结构_集合框架(Collections Framework)详解及代码示例

    简介 集合和数组的区别: 数组存储基础数据类型,且每一个数组都只能存储一种数据类型的数据,空间不可变. 集合存储对象,一个集合中可以存储多种类型的对象.空间可变. 严格地说,集合是存储对象的引用,每个 ...

  9. Android系统(96)---Android 数据交换解析框架Gson使用详解

    Android 数据交换解析框架Gson使用详解 Json 是一种文本形式的数据交换格式,比 xml 更为轻量.Json 的解析和生成的方式很多,在 Android 平台上最常用的类库有 Gson 和 ...

最新文章

  1. 获取在线APP的素材图片
  2. php获取xml某个节点的所有内容,怎样输出XML所有的同名节点内容?
  3. 使用procd执行进程
  4. 《dojo 边学边用》(01), 初识dojo,dojo简介和框架概览
  5. 玩转嵌入式,且看痞子衡
  6. php图片视频,PHP中使用php5-ffmpeg撷取视频图片实例
  7. “康园圈--互联网+校园平台“项目之成果展示及项目总结
  8. 【英语学习】【WOTD】animadversion 释义/词源/示例
  9. Matplotlib 中文用户指南 4.2 基本的文本命令
  10. python n个list如何组成矩阵_学完Python,我决定熬夜整理这篇总结...
  11. java做图形界面计算n_n皇后问题回溯法---java图形界面实现回溯过程
  12. Laravel关联模型中过滤结果为空的结果集(has和with区别)
  13. __line__ php,hitcon 2018受虐笔记一:one-line-php-challenge 学习
  14. Hadoop2.6.0配置參数查看小工具
  15. visa虚拟卡生成器_虚拟信用卡,额度6万!无需面签即可办理
  16. 笛卡尔心形函数表达式_如何用几何画板画笛卡尔心形函数
  17. 腾讯地图如何根据经纬度获取地址
  18. Android面试知识点复习,那些不为人知的秘密
  19. RxJava学习资源
  20. Excel制作+导出

热门文章

  1. 【nexus】 的下载与环境配置
  2. C/C++去小数位取整、向下取整、向上取整与四舍五入
  3. iOS 音频视频制作
  4. Linux Mint TLP设置
  5. ACM—TC 联合招新赛1题解
  6. 实际采用 FleaPHP 的网站
  7. Excl2016密码忘记 破解办法
  8. 高级软件工程第九次作业:东理三剑客团队作业-随笔5
  9. Linux Mint (应用软件— 二进制文件编辑器 :bless)
  10. 思科模拟器:让同一交换机下不同VLAN间的电脑相互通信