Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GreenDao-保存实体和相关文件;实体与DAO上下文分离”;_Java_Android_Orm_Greendao - Fatal编程技术网

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) {
    ...
}