Android ORM 框架:GreenDao 使用详解(进阶篇)
来源:互联网 发布:软件开发项目简介 编辑:程序博客网 时间:2024/06/14 21:30
原文地址:https://juejin.im/post/595a12ba6fb9a06b9a5175bd
本文作者: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; } @Entity public 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; } @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, 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 { @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 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: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, "保存成功 "); } });
- Android ORM 框架:GreenDao 使用详解(进阶篇)
- Android ORM 框架:GreenDao 使用详解(进阶篇)
- Android ORM 框架:GreenDao 使用详解(进阶篇)
- Android ORM 框架:GreenDao 使用详解(基础篇)
- Android ORM 框架:GreenDao 使用详解
- Android ORM框架 greenDao使用
- Android ORM 框架之GreenDAO(二) 进阶
- Android Orm框架(GreenDao)
- Android Orm框架(GreenDao)
- Android ORM 框架之 greenDAO 使用心得
- Android ORM 框架之 greenDAO 使用
- Android ORM 框架之 greenDAO 使用心得
- Android ORM 框架之 greenDAO 使用心得
- Android ORM 框架之 greenDAO 使用心得
- Android ORM 框架之 greenDAO 使用心得
- Android ORM 框架之 greenDAO 使用心得
- Android ORM 框架之 greenDAO 使用心得
- android高效ORM数据库框架greenDao使用
- 《React Native高效开发》之styled-components
- React Native——Component(组件)
- Retrofit2完全解析(二)
- javaWeb文件下载
- 精通比特币
- Android ORM 框架:GreenDao 使用详解(进阶篇)
- Kotlin 基础学习+快速实践
- RxJava 基础扫盲
- Android深入理解JNI(二)类型转换、方法签名和JNIEnv
- FFMPEG学习【libavutil】:Crypto and Hashing(三)
- mavros使用经验记录二
- API错误码对照表
- JAVA设计模式-命令模式
- C++四个默认成员函数&运算符重载