GreenDao insertOrReplace和save的区别

使用数据库插入数据时,使用insert会因为key值(通常是id)重复的异常。我们当然想通过一个简单的方法:有该数据时则更新,没有该数据时则插入的“有更无插”的方法,在GreenDao有两个方insertOrReplacesave,可两者时有区别的

先上结论
insertOrReplace : 传入的对象在数据库中,有则更新无则插入。推荐同步数据库时使用该方法。
save 类似于insertOrReplace,区别在于save会判断传入对象的key,有key的对象执行更新,无key的执行插入。当对象有key但并不在数据库时会执行失败.适用于保存本地列表

分析一下源码
insert无需分析
save源码如下

  /**
     * "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).
     * 

* This is similar to {@link #insertOrReplace(Object)}, but may be more efficient, because if a key is present, * it does not have to query if that key already exists. */ public void save(T entity) { if (hasKey(entity)) { update(entity); } else { insert(entity); } }

可以看出,save只判断了对象key是否存在,并不会去查询数据库。当对象有key但并不在数据库时,执行update语句不会有数据得到更新。

适用场景

  1. 只有本地数据库,且key默认由数据库生成。直接使用save就好
  2. 插入的数据有key,其实这种情况通常是同步线上数据到本地数据库时的情况,因为直接使用了数据库的key,所以不能使用save,必须使用insertOrReplace。

结论
在确保插入数据有key时必须存在于数据库的情况下,适用save更高效。其他情况一律适用insertOrReplace

你可能感兴趣的:(GreenDao insertOrReplace和save的区别)