GreenDao 3.1.1 使用示例及问题总结

GreenDao 3.1.1 使用示例及问题总结

这两天项目的greendao从2.1升级到了greendao7月份发布的3.1.1,关于在项目中如何配置在此不作说明,可以自行百度或者查看官网上的配置说明,配置过程比以往简单很多,在这里我主要想总结的是代码上的变化和一些遇到的问题总结:

  • greendao 3.1.1 新特性
  • Entity和Entity之间建立关系
  • 加密数据库
  • 遇到的坑

greendao3.1.1新特性

注解的形式,更加方便高效。

@Entity
新建一个Entity,在这个Class上面添加@Entity注解。

类BIAOKAXX添加实体注解

@Id
在给某个实体类添加主键Id的时候用到,特别注意的是在这里主键ID只能是Long/long类型,切记,在这遇到坑,写int会报错,绑定数据的时候。

在写Entity的时候除了成员变量之外,其他不需要再自己写,添加好注解之后,(还有 NOT NULL 等注解,这里不做说明,自己去官网看)

Entity处理好了,Make Project 然后greendao就会生成三个文件,分别是DaoMaster,DaoSession,在这里我的实体类是BIAOKAXX,所以生成的DAO文件是BIAOKAXXDao。

添加注解后自动生成的建表语句,新版的greendao我发现不这种自动生成的是不能自行修改sql语句的,尝试过修改但是又恢复了,0.0不知道为啥呢

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,打开数据库需要输入秘钥,秘钥就是代码中所设置的。此工具需要付费,不付费只能看数据库中表的前二十行数据.

sqlitemanager

遇到的坑在本文已经阐述到了。
例如:相同代码,加密数据库插入就报错,非加密的就正常,报这种错。
后来排查了原因,发现还是Dao文件中代码问题,两个bindvalues方法都要写完整。
SQLiteConstraintException: error code 19: constraint failed
还有就是主键的问题,Id必须是Long或者long类型

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值