本文做者:speedy
CSDN 专栏:blog.csdn.net/speedystone…
掘金专栏:juejin.im/post/595a12…java
在 Android ORM 框架:GreenDao 使用详解(基础篇 中,咱们了解了 GreenDao 的基本使用,本文咱们将深刻讲解 GreenDao 的使用 。react
@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;
}复制代码
@Entity public class Customer { @Id private Long id; @ToMany(referencedJoinProperty = "customerId") @OrderBy("date ASC") private Listorders; } @Entity public class Order { @Id private Long id; private Date date; private long customerId; } 复制代码
@Entity public class Product { @Id private Long id; @ToMany @JoinEntity( entity = JoinProductsWithOrders.class, sourceProperty = "productId", targetProperty = "orderId" ) private ListordersWithThisProduct; } @Entity public class JoinProductsWithOrders { @Id private Long id; private Long productId; private Long orderId; } @Entity public class Order { @Id private Long id; } 复制代码
boolean, Boolean
int, Integer
short, Short
long, Long
float, Float
double, Double
byte, Byte
byte[]
String
Date复制代码
例如:将枚举类型转换成整形android
@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; } } 复制代码
方法一:git
Listjoes = userDao.queryRaw("where AGE>?","10");//查询年龄大于10的用户 复制代码
方法二:github
Listjoes = userDao.queryBuilder().where(UserDao.Properties.Age.gt("10")).list(); 复制代码
// 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);复制代码
limit(int) : 限制查询返回的结果的数量。
offset(int): 设置起始位置sql
// 从第二条记录开始查询5条记录 Listlist = userDao.queryBuilder() .offset(2) .limit(5) .list(); 复制代码
LazyListlazyList = userDao.queryBuilder().listLazy(); for (User u:lazyList) { Log.i(TAG, "用户名:"+u.getName()); } lazyList.close(); //再也不使用时必须关闭,不然会致使数据库游标未关闭,从而致使内存泄漏 复制代码
LazyList 是 GreenDao 实现的集合类,实现了 List 接口,因此,直接把 LazyList 当作List 来使用便可,数据库
public class LazyListimplements List 复制代码, Closeable { //省略了具体实现 }
注意: LazyList 再也不使用时必须调用用 close() 方法关闭,不然会致使内存泄漏 。框架
lazyList.close();复制代码
不少时候咱们在查询的时候不能查询到咱们指望的结果,这个时候咱们能够经过修改 QueryBuilder 的两个静态成员变量来打印 SQL 日志,便于排查问题。ide
QueryBuilder.LOG_SQL = true;
QueryBuilder.LOG_VALUES = true;复制代码
QueryBuilderqueryBuilder = 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 直接绑定。post
compile 'net.zetetic:android-database-sqlcipher:3.5.7@aar'复制代码
DevOpenHelper helper = new DevOpenHelper(this, "notes-db-encrypted.db"); Database db = helper.getEncryptedWritableDb(""); daoSession = new DaoMaster(db).newSession(); 复制代码
固然,若是你不是使用 GreenDao 数据库,一样可使用 SQLCipher 加密保护咱们的数据,详细请参考 SQLCipher for Android
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(); RxDaouserDao = daoSession.getUserDao().rx(); userDao.insert(user) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1 复制代码() { @Override public void call(User user) { Log.i(TAG, "保存成功 "); } });