GreenDAO:许多关系导致SQLite查询在UI线程上执行



当在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也可以。

相关内容

  • 没有找到相关文章

最新更新