近期因为需要本地缓存一些数据,故使用到了第三方框架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,网上资料不少,不再进行赘述