GreenDao 使用过程中遇到的问题

最近开发app的时候由于会用到数据库所以采用了开源库GreenDao,于是开启了采坑之旅

1、greendao升级数据库的时候居然会删除原有的数据,这不是坑吗?于是在网上寻求各种方案

推荐使用升级辅助库 GreenDaoUpgradeHelper(可参见https://github.com/yuweiguocn/GreenDaoUpgradeHelper/blob/master/README_CH.md)。该库通过 MigrationHelper在删表重建的过程中,使用临时表保存数据并还原。辅助博客请参考:https://blog.csdn.net/wjk343977868/article/details/53943135以及https://github.com/WJKCharlie/GreenDaoExample.做了一下版本升级测试,修改一下数据库版本号。发现数据被完整保存下来了。于是乎,进行第二次测试,测试一下增加字段或者删除字段,看看效果如何。

2、基本类型(如:int)默认会添加非空约束

于是,第二坑来了,删除字段之后,数据可以完整保存,然后随机增加了一个int的字段test之后,发现数据库升级失败,定位到log,发现抛出这样一个异常

Android:android.database.sqlite.SQLiteConstraintException:UNIQUE constraint failed

查找相关资料之后,发现可能是以下两种原因: 

可能发生这种BUG的两种情况 

1:定义的字段为NOT NULL,而插入时对应的字段为NULL 

2:你定义的自动为PRIMARY,而插入时想插入的值已经在表中存在。 

首先排除第二种情况,那么只能是第一种情况了。新增的test不能非空导致数据库迁移的时候失败。首先怀疑是MigrationHelper的sql语句由问题,定位到将临时表数据转移到新表的那行sql语句(insert into table (?,?,?) select (?,?,?) from tempTable),发现sql语句没有问题。 

于是我去查找看看greendao有没有数据非空的注解,发现并没有。

查看greendao的相关issus,发现以下两个有用信息 

https://github.com/yuweiguocn/GreenDaoUpgradeHelper/issues/23 

https://github.com/greenrobot/greenDAO/issues/17

结论在于:由于greenDAO 3.0 生成的字段添加了非空约束。字段的类型设置为基本类型(如:int)默认会添加非空约束,字段类型设置为对象类型(如:Integer)默认不会添加非空约束,而且最终生成的sql会使用对象类型。

从源码角度看,我们可以查看生成的VersionDao类,发现以下代码,当我们使用int类型的时候,默认创建的字段是非空(NOT NULL),而使用Integer的时候,创建的字段没有添加限制。自己可以试一下,看看区别。

你可能感兴趣的:(GreenDao 使用过程中遇到的问题)