Java GreenDao-保存实体和相关文件;实体与DAO上下文分离”;
我想和绿道一起拯救一个叫做酒店的实体。每个酒店都有一对多的关系,有一些协议,每个协议都有。。。一幅画抵得上千言万语 现在,我要做的是:Java GreenDao-保存实体和相关文件;实体与DAO上下文分离”;,java,android,orm,greendao,Java,Android,Orm,Greendao,我想和绿道一起拯救一个叫做酒店的实体。每个酒店都有一对多的关系,有一些协议,每个协议都有。。。一幅画抵得上千言万语 现在,我要做的是: daoSession.runInTx(new Runnable() { @Override public void run() { ArrayList<Hotel> listOfHotels = getData().getAvailability(); for(Hotel h : list
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);
}
});
我理解这是因为我试图从酒店实体获取协议,该实体不是来自数据库,而是来自另一个来源(在本例中是web服务)。但是为什么这会发生在ha.getDeadline()上而不是h.getAgreements()上呢
现在,我有了酒店对象,它包含了几乎所有的数据:协议、截止日期、政策、备注、图片、报告。我只想告诉绿岛:省省吧!如果我做不到,我必须在树上循环-这就是我试图用上面的代码做的-我应该怎么做
我读到我必须“首先使用Dao存储/加载对象”。非常棒,但是。。。它是如何工作的?我读了那本书,但什么也找不到
感谢所有愿意提供帮助的人:-)在某个时候,当您收到Web服务的响应时,您正在创建新的实体对象并用信息填充它们。然后尝试在数据库中插入每个新对象
如果您愿意,您可以使用insertOrReplaceInTx为一家酒店插入all n协议,但在所有相关对象都进入数据库之前,您不应该使用任何关系。我认为greendao团队必须在该方法中添加以下控件 getToOneField()类似于getToManyList()中的 所以在你的酒店协议课上
@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) {
...
}
因此,如果您从RESTJSON接收数据
对象被填充,getProperty()方法从对象返回属性字段,而不是从数据库返回属性字段,就像它在列表中所做的那样
然后您可以插入或替换它
然后,当您从db加载或深入加载对象时,属性为null,greendao从db获取它如果不知道getData()是什么,很难说;做此外,了解您如何生成实体以及您拥有的不动产也会有所帮助代码>。这就是我调用getAvailability的对象,只返回一个Hotel对象列表。这些来自Web服务的响应,从未见过数据库,我可以将它们存储到数据库中,但子项没有存储。如果我试图检索它们-就像它与实体断开一样,则会从DAO上下文错误中分离出来。关于关系,你想确切地知道什么?当应用程序加载时,我可以发布我的GreenDaoGenerator的片段,我对早餐类型也会这样做。我调用
daoSession.getHotelBreakfastDao().insertoreplaceintx(getData().getBreakfasts())我从getData().getBreakfasts()
中得到的是HotelBreakfast的列表。但是它们与其他表没有任何关系,所以可以完美地插入到DB中代码>我相信这就是我正在做的:-如果我在中间注释所有的行,我只做代码> ARAYLIST ListFoCals= GETDATA().GETAvababLyIy();daoSession.getHotelDao().insertoreplaceintx(酒店列表)代码>它可以工作,我保存数据库中的所有酒店(但只保存酒店)。为什么它不能和其他实体一起工作?像这样的行List hotelAgreements=h.getAgreements()
您使用的是酒店和协议之间的关系,而酒店或其协议均未存储在数据库中。好的,我现在看到了问题:由于这两个实体不在数据库中,因此我无法从酒店中获取协议,即使酒店已获得其自身的所有数据。但是,既然我得到了一个完整的Hotel对象及其所有子对象,我该如何将其存储到数据库中呢?我把ORM理论都搞错了吗?我应该尝试什么方法?谢谢。您主要从Web服务中获得什么?也许是JSON?或者你得到了整个酒店的对象?我得到了一个JSON。Jofre,我们是不是应该在聊天室见面?如果你想,我已经在那里了。
@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) {
...
}