【发布时间】:2018-06-14 18:12:42
【问题描述】:
我正在尝试使用 GreenDAO 保存一个名为 hotel 的实体。每个酒店都有一些协议是一对多的关系,每个协议都有……好吧,一张图片胜过一千字。
现在,我要做的是:
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);
}
});
这当然行不通。我在以下行收到“实体与 DAO 上下文分离”错误:
HotelAgreementDeadline hotelAgreementDeadline = ha.getDeadline();
我理解这是因为我尝试从不是来自数据库的酒店实体获取协议,而是从另一个来源(在本例中为 Web 服务)获取协议。但是为什么 ha.getDeadline() 会发生这种情况,而不是 h.getAgreements()?
现在,我有了 Hotel 对象,它包含几乎所有数据:协议、截止日期、政策、备注、图片、报告。我只想告诉GreenDAO:保存它!如果我不能,我必须循环遍历树——这就是我试图用上面的代码做的——我应该怎么做?
Here 我读到我必须“首先使用 Dao 存储/加载对象”。非常棒,但是......它是如何工作的?我阅读了greenDAO documentation about relations,但找不到任何东西。
感谢所有愿意提供帮助的人 :-)
【问题讨论】:
-
不知道什么很难说 getData().getAvailability();做。此外,这将有助于了解您如何生成实体以及您拥有哪些实体。
-
我从 web 服务获得响应并将其转换为:
responseAgreements = (HotelAvailabilityResponse) response;。这是我调用 getAvailability 的对象,只是返回一个 Hotel 对象列表。这些来自网络服务的响应,从未见过数据库,我可以将它们存储到数据库中,但不存储子项目。如果我尝试检索它们 - 就像它因 Entity is detached from DAO context 错误而中断。关于关系,您想确切了解什么?我可以发布我的 GreenDaoGenerator 片段 -
当应用程序加载时,我对早餐类型做同样的事情。我打电话给
daoSession.getHotelBreakfastDao().insertOrReplaceInTx(getData().getBreakfasts());,我从getData().getBreakfasts()得到的是一份HotelBreakfast 列表。但是它们与其他表没有任何关系,因此可以完美地插入数据库。 -
我认为如果您通过
getData().getAvailability();中的代码会有所帮助