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

Android GreenDAO:ToMany关系导致在UI线程上执行SQLite查询,android,multithreading,android-sqlite,greendao,Android,Multithreading,Android Sqlite,Greendao,在实体上定义ToMany relationship时,生成的代码如下所示(ProductEntity与MediaEntity具有ToMany relationship): /** *对于多个关系,在第一次访问时(以及重置后)解决。 *对许多关系的更改不会持久化,请对目标实体进行更改。 */ @已生成(哈希值=580223476) 公共列表getMedia(){ 如果(媒体==null){ final DaoSession DaoSession=this.DaoSession; if(daoSes

在实体上定义ToMany relationship时,生成的代码如下所示(ProductEntity与MediaEntity具有ToMany relationship):

/**
*对于多个关系,在第一次访问时(以及重置后)解决。
*对许多关系的更改不会持久化,请对目标实体进行更改。
*/
@已生成(哈希值=580223476)
公共列表getMedia(){
如果(媒体==null){
final DaoSession DaoSession=this.DaoSession;
if(daoSession==null){
抛出新的DaoException(“实体与DAO上下文分离”);
}
mediatentitydao targetDao=daoSession.getmediatentitydao();
List mediaNew=targetDao.\u queryProductEntity\u Media(productId);
已同步(此){
如果(媒体==null){
媒体=新媒体;
}
}
}
返回媒体;
}
现在,即使我们在后台线程上获得ProductEntity的实例(例如,使用自定义加载程序),它的getMedia()方法也将在UI线程上调用,这将导致在UI线程上执行由第一次调用getMedia()引起的SQLite查询

是否有办法防止子对象的这种延迟加载,并指示GreenDao在父实体创建/初始化时解析所有依赖项并填充所有字段

链接到GreenDAO的github页面上相应的支持票证:


另外,我们可以在从DaoSession获得ProductEntity后手动添加对getMedia()的调用,但这不是一个有效的解决方案:太容易出错。

正如您所写的,可以通过使用getter在后台线程中预加载来避免惰性getter与数据库对话。没有更好的办法了


有时甚至可以在UI线程中调用统一化的getter。这取决于您的情况。

正如您所写的,通过使用getter在后台线程中预加载数据库,可以避免惰性getter与数据库对话。没有更好的办法了

有时甚至可以在UI线程中调用统一化的getter。这取决于你的情况

/**
 * 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;
}