当在Entity上定义ToMany关系时,生成的代码如下所示(ProductEntity与MediaEntity有ToMany关系):
/**
* To-many relationship, resolved on first access (and after reset).
* Changes to to-many relations are not persisted, make changes to the target entity.
*/
@Generated(hash = 580223476)
public List<MediaEntity> getMedia() {
if (media == null) {
final DaoSession daoSession = this.daoSession;
if (daoSession == null) {
throw new DaoException("Entity is detached from DAO context");
}
MediaEntityDao targetDao = daoSession.getMediaEntityDao();
List<MediaEntity> mediaNew = targetDao._queryProductEntity_Media(productId);
synchronized (this) {
if(media == null) {
media = mediaNew;
}
}
}
return media;
}
现在,即使我们在后台线程上获取ProductEntity的实例(例如使用自定义Loader),也会在UI线程上调用其getMedia()方法,这将导致第一次调用getMedia()导致的SQLite查询在UI线程上执行。
有没有办法防止这种延迟加载子对象并指示GreenDao解析所有依赖项并在父实体创建/初始化时填充所有字段?
链接到GreenDAO的github页面上的相应支持票证:https://github.com/greenrobot/greenDAO/issues/416
P.S。我们可以在从DaoSession获得ProductEntity之后手动添加对getMedia()的调用,但这不是一个有效的解决方案:太容易出错。
答案 0 :(得分:0)
正如您所写的那样,通过使用getter在后台线程中预加载来避免懒惰的getter与数据库交谈。没有更好的方法。
有时甚至可以在UI线程中调用单元化的getter。这取决于你的情况。