GreenDao 3.1.1 使用示例及问题总结
这两天项目的greendao从2.1升级到了greendao7月份发布的3.1.1,关于在项目中如何配置在此不作说明,可以自行百度或者查看官网上的配置说明,配置过程比以往简单很多,在这里我主要想总结的是代码上的变化和一些遇到的问题总结:
- greendao 3.1.1 新特性
- Entity和Entity之间建立关系
- 加密数据库
- 遇到的坑
greendao3.1.1新特性
注解的形式,更加方便高效。
@Entity
新建一个Entity,在这个Class上面添加@Entity注解。
@Id
在给某个实体类添加主键Id的时候用到,特别注意的是在这里主键ID只能是Long/long类型,切记,在这遇到坑,写int会报错,绑定数据的时候。
在写Entity的时候除了成员变量之外,其他不需要再自己写,添加好注解之后,(还有 NOT NULL 等注解,这里不做说明,自己去官网看)
Entity处理好了,Make Project 然后greendao就会生成三个文件,分别是DaoMaster,DaoSession,在这里我的实体类是BIAOKAXX,所以生成的DAO文件是BIAOKAXXDao。
3.1.1版本的XXXDao文件中有两个bindValues方法,截图如下。
Entity 和 Entity 之间建立关系
在处理表和表之间关联的时候,以前是添加relation,现在也是使用注解的形式 有 @ToOne @ToMany的形式。
在这里我关联的是两个实体,BIAOKAXX和ChaoBiaoSJ通过一个字段S_CID来关联起来。
注:在BIAOKAXX实体类
@ToMany(joinProperties = {
@JoinProperty(name = "S_CID", referencedName = "S_CID")
})
private List<ChaoBiaoSJ> chaoBiaoSj;
注解添加编译好后会发现在实体类中添加了这个方法:
@Generated(hash = 848738229)
public List<ChaoBiaoSJ> getChaoBiaoSj() {
if (chaoBiaoSj == null) {
final DaoSession daoSession = this.daoSession;
if (daoSession == null) {
throw new DaoException("Entity is detached from DAO context");
}
ChaoBiaoSJDao targetDao = daoSession.getChaoBiaoSJDao();
List<ChaoBiaoSJ> chaoBiaoSjNew = targetDao._queryBIAOKAXX_ChaoBiaoSj(S_CID);
synchronized (this) {
if(chaoBiaoSj == null) {
chaoBiaoSj = chaoBiaoSjNew;
}
}
}
return chaoBiaoSj;
}
通过此方法就可以在BIAOKAXX中获得ChaoBiaoSJ了。
加密数据库
以前版本的greendao就可以支持数据库加密,使用加密数据库的框架
* net.zetetic:android-database-sqlcipher*,在3.1.1上只不过是实现起来更为简易了。
DaoMaster.DevOpenHelper openHelper=new DaoMaster.DevOpenHelper(this,MY_PWD_DIR,null);
注:参数二可以自定义的数据库的生成位置,建议使用 xxx.db 来作为后缀,查看工具可以识别。
encryptedDaoSession = new DaoMaster(openHelper.getEncryptedWritableDb(MY_PWD)).newSession();
注:MY_PWD就是可以自行定义的字符串来作为秘钥。后期每次去打开数据库查询插入等操作都需要秘钥。
非加密,在获得Db的时候直接调用getWriteableDb()方法
DaoSession normalSession = new DaoMaster(openHelper.getWritableDb()).newSession();
注:数据库加密后,查看工具使用 sqliteManager,打开数据库需要输入秘钥,秘钥就是代码中所设置的。此工具需要付费,不付费只能看数据库中表的前二十行数据.
遇到的坑在本文已经阐述到了。
例如:相同代码,加密数据库插入就报错,非加密的就正常,报这种错。
后来排查了原因,发现还是Dao文件中代码问题,两个bindvalues方法都要写完整。
SQLiteConstraintException: error code 19: constraint failed
还有就是主键的问题,Id必须是Long或者long类型