当在Entity上定义了许多关系时,生成的代码看起来像这样(ProductEntity与MediaEntity有许多关系):
/**
* 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),它的getMedia()方法将在UI线程上被调用,这将导致由第一次调用getMedia()引起的SQLite查询在UI线程上执行。
是否有一种方法可以防止这种惰性加载子对象,并指示GreenDao在父实体创建/初始化时解析所有依赖项并填充所有字段?
链接到GreenDAO的github页面上相应的支持票据:https://github.com/greenrobot/greenDAO/issues/416
注:我们可以在从DaoSession获得ProductEntity后手动添加对getMedia()的调用,但这不是一个有效的解决方案:太容易出错。
正如您所写的,可以通过在后台线程中使用getter预加载数据库来避免惰性getter与数据库通信。没有更好的办法。
有时候在UI线程中调用初始化的getter也可以。