GreenDao的更新无效

2020-08-28  本文已影响0人  草色陆连清

近期因为需要本地缓存一些数据,故使用到了第三方框架GreenDao,该框架的使用方法在此不做赘述,此篇只记录使用greendao过程中遇到的坑(后续使用中如果遇到其他问题再进行更新)。

1.调用自动生成的dao对象的update方法后无效:
调用update方法后,再获取数据库中的数据仍会取到更新前的数据。该现象是因为greendao自带的缓存机制并不会随着调用update方法后及时进行更新,所以在调用update方法后,需要调用detachAll方法进行缓存的删除。

    public void updateLocation(WeatherLocation weatherLocation) {
        mWritableDao.update(weatherLocation);
        //更新后删除缓存数据库信息
        mWritableDao.detachAll();
    }

2.在对被注释了@Entity的实体类进行修改后(新增、删除该实体类中的变量),重新运行程序后在使用greendao的地方会报找不到相关字段的sql语句错误:
greendao只会在程序初始化之后自动生成@Entity实体类的相关表,在app进行更新后并不会根据@Entity实体类的更新而去重新构建相关表类,解决该问题的方法为卸载后重新安装app。但是一方面在实际开发过程中,经常会对要缓存的实体类中的字段进行增删,另一方面在版本更新后让用户卸载再安装体验太差。所以在此提供一个存储思路:对于要缓存的对象,在进行缓存前将该实体类进行json转换,把该对象转换成string字符串,再将该字符串作为@Entity实体类中的string字段进行缓存,@Entity实体类中的变量即可固定成数据库id、string字符串

@Entity
public class WeatherLocationTotal {


    @Id(autoincrement = true)
    private Long dbid;
    private String json;

    @Generated(hash = 197335340)
    public WeatherLocationTotal(Long dbid, String json) {
        this.dbid = dbid;
        this.json = json;
    }

    @Generated(hash = 1000997541)
    public WeatherLocationTotal() {
    }

    public Long getDbid() {
        return this.dbid;
    }

    public void setDbid(Long dbid) {
        this.dbid = dbid;
    }

    public String getJson() {
        return this.json;
    }

    public void setJson(String json) {
        this.json = json;
    }

如此,只要在取出json字段后再进行一次json转对象的操作就可以完成对象存储,解决上述问题。这里只提供一个思路,具体json如何转实体类以及实体类如何转json,网上资料不少,不再进行赘述

上一篇 下一篇

猜你喜欢

热点阅读