GreenDao - 保存实体和相关 - "实体与DAO环境分离"

时间:2015-04-13 14:43:30

标签: java android orm greendao

我试图用GreenDAO保存一个叫做酒店的实体。每个酒店都有一对多的关系和一些协议,每个协议都有......好吧,一张图片胜过千言万语。

enter image description here

现在,我所做的是以下内容:

daoSession.runInTx(new Runnable() {
    @Override
    public void run() {

        ArrayList<Hotel> listOfHotels = getData().getAvailability();

            for(Hotel h : listOfHotels)
            {
                List<HotelAgreement> hotelAgreements = h.getAgreements();
                for(HotelAgreement ha : hotelAgreements) {
                    ha.setHotel_id(h.getHotel_id());
                    HotelAgreementDeadline hotelAgreementDeadline = ha.getDeadline();
                    List<HotelRemark> hr = hotelAgreementDeadline.getRemarks();
                    List<HotelAgreementDeadlinePolicies> hadp = hotelAgreementDeadline.getPolicies();

                    daoSession.getHotelReportDao().insertOrReplaceInTx( h.getReports() );
                    daoSession.getHotelPictureDao().insertOrReplaceInTx( h.getPictures() );

                    daoSession.getHotelRemarkDao().insertOrReplaceInTx(hr);
                    daoSession.getHotelAgreementDeadlinePoliciesDao().insertOrReplaceInTx(hadp);
                    daoSession.getHotelAgreementDeadlineDao().insertOrReplace(hotelAgreementDeadline);
                    daoSession.getHotelAgreementDao().insertOrReplace(ha);
                }

                //                daoSession.getHotelReportsDao().insertOrReplace( getData().getReports() );

            }

        daoSession.getHotelDao().insertOrReplaceInTx(listOfHotels);
    }
});

当然,这不起作用。我得到了一个&#34;实体与DAO上下文分离了#34;以下行中的错误:

HotelAgreementDeadline hotelAgreementDeadline = ha.getDeadline();

我理解这是因为我试图从酒店实体获得协议,这些协议不是来自数据库,而是来自其他来源(在这种情况下是一个Web服务)。但是为什么ha.getDeadline()而不是h.getAgreements()会发生这种情况呢?

现在,我有了酒店对象,它确实包含了所有数据:协议,截止日期,政策,备注,图片,报告。我想告诉GreenDAO:保存吧!如果我不能和我必须在树上循环 - 这就是我试图用上面的代码做的 - 我该怎么做呢?

Here我读到我必须首先使用Dao&#34;来存储/加载对象。非常棒,但......它是如何工作的?我看了greenDAO documentation about relations,但找不到任何东西。

感谢所有愿意提供帮助的人: - )

2 个答案:

答案 0 :(得分:0)

在某些时候,当您从Web服务获得响应时,您将创建新的实体对象并使用信息填充它们。在此之后尝试在数据库中插入每个新对象。

如果需要,您可以使用insertOrReplaceInTx为酒店插入所有n协议,但在所有涉及的对象都在数据库中之前不应使用任何关系。

答案 1 :(得分:0)

我认为greendao团队必须在方法中添加以下控件 getToOneField()就像在getToManyList()

中一样
if(property == null){
    code already generated by greendao plugin
}
return property;

所以在你的情况下在HotelAgreements类

@Keep
public DeadLine getDeadLine {
    if(deadLine == null) {
        long __key = this.deadLineId;
        if (deadLine__resolvedKey == null || !deadLine__resolvedKey.equals(__key)) {
            final DaoSession daoSession = this.daoSession;
            if (daoSession == null) {
                throw new DaoException("Entity is detached from DAO context");
            }
            DeadLineDao targetDao = daoSession.getDeadLineDao();
            DeadLine deadLineNew = targetDao.load(__key);
            synchronized (this) {
                deadLine = deadLineNew;
                deadLine__resolvedKey = __key;
            }
        }
    }
    return deadLine;
}

添加控件

if(deadLine == null) {
    ...
}

所以如果你从rest json接收数据 对象被填充,getProperty()方法从对象返回属性字段而不是从数据库返回属性字段,就像它与列表一样 然后你可以插入或替换它

然后,当你从db加载或加载深度对象时,属性为null,greendao从DB中取出