GreenDao里面提供存储数据的方法有三个:
出现重复数据之前的代码如下:
public void dialogShow(final String[]arr, final int position,String head){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(head).setSingleChoiceItems(arr, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
String value = arr[i];
parameterBeanDao.save(null, title[position], value));
PowerSettingActivity.this.list.get(position).setDes(value);
adapter.notifyItemChanged(position);
dialogInterface.dismiss();
}
}).show();
}
parameterBeanDao.save(null, title[position], value));重点在于id我传入null,设置自增,看下sava源码
save的源码如下:
public void save(T entity) {
if (hasKey(entity)) {
update(entity);
} else {
insert(entity);
}
}
大家可以看到其实他就是update和insert的一个判断使用,有个hasKey的方法,然后查看hasKey的源码:
abstract protected boolean hasKey(T entity);
发现是一个抽象方法,那我只能去他的继承类parameterBeanDao里面去找了
@Override
public boolean hasKey(User entity)
{
return entity.getId() != null;
}
因为id传入的是null,所以这里的entity.getid()始终为null,返回false所以只能进insert(entity)这里了,那么如何避免这种情况
这是修改之后的代码:
public void dialogShow(final String[]arr, final int position,String head){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(head).setSingleChoiceItems(arr, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
String value = arr[i];
List list = parameterBeanDao.queryBuilder().
where(ParameterBeanDao.Properties.Name.eq(title[position])).list();
parameterBeanDao.save(new ParameterBean(list.size()==0?null:list.get(0).getId(), title[position], value));
PowerSettingActivity.this.list.get(position).setDes(value);
adapter.notifyItemChanged(position);
dialogInterface.dismiss();
}
}).show();
}
save的时候加一个判断,如果之前数据库保存的有,就去取之前的id,这样就解决了
总结:
insert 插入的对象id必须唯一,如果数据库中存在相同id,则会报错;
insertorreplace 插入对象id可以不唯一,因为可以替换掉;
save 插入对象id必须存在当前的数据库中,如果不存在无法保存,主要用于本地数据库的操作;作用类似本地数据库的insertorreplace;