我试图用GreenDAO保存一个叫做酒店的实体。每个酒店都有一对多的关系和一些协议,每个协议都有......好吧,一张图片胜过千言万语。
现在,我所做的是以下内容:
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,但找不到任何东西。
感谢所有愿意提供帮助的人: - )
答案 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中取出