greenDAO @toMany关系表现不佳

时间:2016-12-16 15:46:37

标签: android performance sqlite greendao

我在我的App中使用greenDA作为本地数据库来存储父子关系(简化示例)。

@Entity
class ParentDB {

    @Id
    @Unique
    @NotNull
    private String id;

    @ToMany(referencedJoinProperty = "parentId")
    private List<ChildDB> children;
    ...
}

@Entity
class ChildDB {

    @Id
    @Unique
    @NotNull
    private String id;

    private String parentId;
    ...
}

大约有4000多个ParentDB对象。并且至少有尽可能多的ChildDB对象。 现在,为了从DB对象映射我的业务对象(BO),我必须遍历所有父级并为每个父级获取子级。

List<Parent> parentList = new ArrayList<>();

for(ParentDB parentDB : ParentDBDao.loadAll()){
    Parent parent = new Parent();

    List<ChildDB> childrenDB = parentDB.getChildren()); // <- PROBLEM

    ... map each child to a BO ...

    parent.setChildren(children);
    parentList.add(parent);
}

此操作大约需要16-30秒! 当删除有问题的行时,加载所有父母大约需要400毫秒(这仍然是安静缓慢的afaik)

生成的getChildren()方法在内部执行类似于此的附加查询:

List<ChildDB> childrenNew = ChildDBDao._queryParentDB_Children(id);

我的猜测是循环中的4000个查询导致性能不佳。

作为一种解决方法,我正在加载所有孩子,并在代码中手动与他们各自的父母建立联系。这需要大约800毫秒,这是可以接受的但是无法实现ORDA DB的目的,例如greenDAO。 当ChilDB包含另一个Child2DB时,尤其如此,并且BO映射不能轻易地抽象出来但必须手动完成。

我是否采取了错误的方法或有没有办法消除瓶颈?

0 个答案:

没有答案