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。