GreenDao insertOrReplace和save的区别

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

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

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

上一篇 GreenDao 3 的配置及使用
下一篇 CentOS命令行安装 Android SDK 和 Android NDK
目录
文章列表
1 JSON Web Token(JWT)原理和用法介绍
JSON Web Token(JWT)原理和用法介绍
2
DDL与DML的区别
DDL与DML的区别
3
Android检查手机是否被root
Android检查手机是否被root
4
Spring Boot集成RabbitMQ详解
Spring Boot集成RabbitMQ详解
5
Android AsyncTask的缺点
Android AsyncTask的缺点
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。