Android ORM 框架:GreenDao 使用详解(进阶篇)_第1张图片

本文作者:speedy
CSDN 专栏:http://blog.csdn.net/speedystone/article/details/74193053
掘金专栏:https://juejin.im/post/595a12ba6fb9a06b9a5175bd

前言

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

一、复杂表结构

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

@Entitypublic class Order {    @Id     private Long id;    private long customerId;    @ToOne(joinProperty = "customerId")    private Customer customer;}@Entitypublic class Customer {    @Id     private Long id;}

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

@Entitypublic class Customer {    @Id     private Long id;    @ToMany(referencedJoinProperty = "customerId")    @OrderBy("date ASC")    private List orders;}@Entitypublic class Order {    @Id private Long id;    private Date date;    private long customerId;}

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

@Entitypublic class Product {    @Id private Long id;    @ToMany    @JoinEntity(            entity = JoinProductsWithOrders.class,            sourceProperty = "productId",            targetProperty = "orderId"    )    private List ordersWithThisProduct;}@Entitypublic class JoinProductsWithOrders {    @Id private Long id;    private Long productId;    private Long orderId;}@Entitypublic class Order {    @Id private Long id;}

二、自定义类型

1,GreenDao 默认支持的类型有

boolean, Booleanint, Integershort, Shortlong, Longfloat, Floatdouble, Doublebyte, Bytebyte[]StringDate

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

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

@Entitypublic 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<Role, Integer> {        @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 namequeryBuilder.orderAsc(Properties.LastName);// in reversequeryBuilder.orderDesc(Properties.LastName);// order by last name and year of birthqueryBuilder.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<E> implements List<E>, 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:3.5.7@aar'

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, "保存成功 ");             }         });

更多相关文章

  1. android GreenDao数据库框架学习(1)
  2. android短彩信数据库设计(三)
  3. [通讯录] android通讯录数据库表解析和添加,访问通讯录
  4. 我的android 第15天 -使用SQLiteOpenHelper获取用于操作数据库的
  5. Android系统源码数据库(mmssms.db)
  6. Android深入浅出系列课程---Lesson9 AAF110430_ActivityWindowVi
  7. Android系统各种类型的service刨根解读
  8. Android之SQLite存取DATETIME类型
  9. 重点核心☆☆☆☆☆按钮点击事件的四种类型

随机推荐

  1. android 自定义控件学习之三 控件布局常
  2. Android中LocationManager的简单使用,获
  3. Android(安卓)Zip文件解压缩代码
  4. Android中Uri的使用
  5. ANDROID 应用退出
  6. Android利用Fiddler进行网络数据抓包
  7. AndFix解析——(上)
  8. 如何编程实现开启或者关闭GPS
  9. 构建 Android(安卓)手机 RSS 阅读器
  10. Android音乐播放器开发