集成GreenDao3,遇到PRIMARY KEY must be unique的问题解决

1 使用GreenDao:
greenrobot一直出精品,GreenDao口碑很好,3.0以后又支持了注解,必须要用一下试试。

2 集成:
读了几篇帖子,开始动手集成,集成很简单。
我声明了一个Bean:

@Entity
public class StateCodeBean implements Serializable {
    @Id(autoincrement = true)
    private long id;
    @Unique
    private String CodeId;

DaoManager写了业务逻辑的方法:
如:Query,insert。
3 遇到问题:
在调用insert方法时,报错了:

android.database.sqlite.SQLiteConstraintException: PRIMARY KEY must be unique

4 尝试解决:
这是说主键必须唯一啊,很明显的提示了,于是去看注解了@Id的字 段,确实如大神所说是:Long或者long类型啊。
4.1 删除了 (autoincrement = true) 试试,运行后,还是不行。
4.2 查看StateCodeBeanDao方法里的bindValues方法:

@Override
    protected final void bindValues(DatabaseStatement stmt, StateCodeBean entity) {
        stmt.clearBindings();
        long id = entity.getId();
        stmt.bindLong(1, id);

        String CodeId = entity.getCodeId();
        if (CodeId != null) {
            stmt.bindString(2, CodeId);
        }
}

怀疑是没有if (CodeId != null) {的判断,于是修改为:

Long id = entity.getId();
        if (id != null) {
            stmt.bindLong(1, id);
        }

重新运行后,发现:StateCodeBeanDao文件的代码又恢复了回去。

注意:XXXDao文件是系统框架生成,不能修改,当然,你打算逆天改命,修改了也没用。

5 最终解决方法:
文头说的,Long型或者long型,让我产生了怀疑,是不是基本数据类型的问题,于是Bean声明里做了修改:Long–>long

@Entity
public class StateCodeBean implements Serializable {
    @Id(autoincrement = true)
    private Long id;
    @Unique
    private String CodeId; //  20

删除了gen目录(DaoMaster,DaoSession, xxxDao文件的目录),
注释掉了程序里使用这几个类的地方,
rebuild,重新运行后,发现xxDao文件里有了null的判断:

@Override
    protected final void bindValues(DatabaseStatement stmt, StateCodeBean entity) {
        stmt.clearBindings();
        Long id = entity.getId();
        if (id != null) {
            stmt.bindLong(1, id);
        }

        String CodeId = entity.getCodeId();
        if (CodeId != null) {
            stmt.bindString(2, CodeId);
        }
}

运行后,也不再报错,达到了预期。

6 总结:
(1)这个Long—>long还是不能错用的,要注解为@Id的字段最好用Long型。
这个问题得到了初步解决。但并未深究原因,很是惭愧。再次希望能帮遇到此类错误的朋友填坑。
(2)如果是配置文件,可以考虑先delete该表全部数据,然后再插入全部,比较无脑,懒。
(3)最好是:判断库里是否已经存在,如果存在,则update,不存在,再insert。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值