GreenDao如何避免插入相同的数据

GreenDao里面提供存储数据的方法有三个:

  • save(T entity)
    "Saves" an entity to the database: depending on the existence of the key property, it will be inserted (key is null) or updated (key is not null).通过key属性判断是否存在,如果存在就更新数据,如果key为null就插入。
  • insert(T entity)
    Insert an entity into the table associated with a concrete DAO.
    插入实体类,这个是直接插入。
  • insertOrReplace(T entity)
    Insert an entity into the table associated with a concrete DAO.将实体插入到与具体DAO关联的表中,这是官方api的给的解释,不过他的实际效果和save很类似,就是如果存在就修改,不存在插入。

 

出现重复数据之前的代码如下: 

 

  • 我这里操作的是本地数据库,所以用了save方法
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;

 

你可能感兴趣的:(GreenDao如何避免插入相同的数据)