GreenDao insertOrReplace和save的区别

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

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

save方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* "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).
* <p>
* 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语句不会有数据得到更新。

适用场景

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

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

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :