Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.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 为什么Room observer一次又一次地将相同的实体添加到数据库中?_Java_Android_Json_Android Room_Observers - Fatal编程技术网

Java 为什么Room observer一次又一次地将相同的实体添加到数据库中?

Java 为什么Room observer一次又一次地将相同的实体添加到数据库中?,java,android,json,android-room,observers,Java,Android,Json,Android Room,Observers,我使用改型检索我创建并上传到互联网的JSON数据。我可以成功地检索和显示数据,但当我将数据插入Room数据库时,只添加了最后一个JSON对象,添加的次数与JSON对象的数量相同 根据我的log记录,JSON数据是在inconversionsonResponse()方法中整体检索的-没有问题。但是根据Room中的getAllData()上的observer方法,只有最后一个JSON对象被添加到Room。每个JSON对象触发一次观察者,但每次仅显示最后一个JSON对象。我使用Ridill SQLlt

我使用
改型
检索我创建并上传到互联网的
JSON
数据。我可以成功地检索和显示数据,但当我将数据插入
Room
数据库时,只添加了最后一个
JSON
对象,添加的次数与
JSON
对象的数量相同

根据我的
log
记录,
JSON
数据是在
inconversions
onResponse()
方法中整体检索的-没有问题。但是根据
Room
中的
getAllData()
上的
observer
方法,只有最后一个
JSON
对象被添加到
Room
。每个
JSON
对象触发一次观察者,但每次仅显示最后一个
JSON
对象。我使用
Ridill SQLlte
仔细检查了数据库文件,它确认了这一点:

我的
Log
如下所示:

//第一个观察者什么也不显示

D/TAG: OBSERVED
//检索到JSON,看起来很好

D/TAG: JSON GATHERED
D/TAG: ROOM NAME: Bob
D/TAG: ROOM DATE: 3/13/2015
D/TAG: ROOM FROM: 8:00
D/TAG: ROOM UNTIL: 13:00
D/TAG: ROOM NAME: Joe
D/TAG: ROOM DATE: 1/3/2015
D/TAG: ROOM FROM: 12.30
D/TAG: ROOM UNTIL: 13:00
D/TAG: ROOM NAME: Martin
D/TAG: ROOM DATE: 1/5/2015
D/TAG: ROOM FROM: 15.30
D/TAG: ROOM UNTIL: 16:00
//再次设置观察者,显示最后一个JSON对象

D/TAG: OBSERVED
D/TAG ROOM: MyRoomEntity{id=1, name='Martin', date='1/5/2015', from='15.30', until='16:00'}
//观察者再次激发,现在第二次添加了最后一个JSON对象

D/TAG: OBSERVED
D/TAG ROOM: MyRoomEntity{id=1, name='Martin', date='1/5/2015', from='15.30', until='16:00'}
D/TAG ROOM: MyRoomEntity{id=2, name='Martin', date='1/5/2015', from='15.30', until='16:00'}
//观察者再次激发,现在第三次添加最后一个对象。

D/TAG: OBSERVED
D/TAG ROOM: MyRoomEntity{id=1, name='Martin', date='1/5/2015', from='15.30', until='16:00'}
D/TAG ROOM: MyRoomEntity{id=2, name='Martin', date='1/5/2015', from='15.30', until='16:00'}
D/TAG ROOM: MyRoomEntity{id=3, name='Martin', date='1/5/2015', from='15.30', until='16:00'}
onResponse()
方法如下所示:

public void onResponse(Call<List<RetrofitVariables>> call, Response<List<RetrofitVariables>> response) {
            List<RetrofitVariables> myResponse = response.body();
            MyRoomEntity myRoomEntity = new MyRoomEntity();

            Log.d( "TAG" , "JSON GATHERED" );

            if(myResponse != null) {
                MyRoomDatabase db = myViewModel.getRoomDatabase();

                    for(RetrofitVariables item: myResponse) {

                        Log.d( "TAG" , "name: " + item.getName());
                        Log.d( "TAG" , "from: " + item.getFrom());
                        Log.d( "TAG" , "until: " + item.getUntil());
                        Log.d( "TAG" , "Counter: " + counter);

                        myRoomEntity.setName( item.getName() );
                        myRoomEntity.setDate( item.getDate() );
                        myRoomEntity.setFrom( item.getFrom() );
                        myRoomEntity.setUntil( item.getUntil() );

                        //THESE LOGS SHOW CORRECT RESULT
                        Log.d( "TAG" , "ROOM NAME: " + myRoomEntity.getName());
                        Log.d( "TAG" , "ROOM DATE: " + myRoomEntity.getDate());
                        Log.d( "TAG" , "ROOM FROM: " + myRoomEntity.getFrom());
                        Log.d( "TAG" , "ROOM UNTIL: " + myRoomEntity.getUntil());


                        myViewModel.insertDataVM( myRoomEntity );

                    }
            }
        }
onResponse()
方法中,一切看起来都很好,那么为什么不能将数据正确地添加到
房间中呢?如何将所有
JSON
对象放入
Room
,而不仅仅是最后一个?我错过了什么


提前感谢您的帮助

您不想重用房间实体对象。移动

MyRoomEntity myRoomEntity = new MyRoomEntity();
填充循环中的

for(RetrofitVariables item: myResponse) {
    MyRoomEntity myRoomEntity = new MyRoomEntity();
    myRoomEntity.setName( item.getName() );
    myRoomEntity.setDate( item.getDate() );
    myRoomEntity.setFrom( item.getFrom() );
    myRoomEntity.setUntil( item.getUntil() );

    myViewModel.insertDataVM( myRoomEntity );
}

令人惊叹的!它就像一个符咒!当我想到这一点时,它当然是有道理的。尽管如此,哈哈。非常感谢@Roger,这为我节省了很多时间和头疼:)非常感谢你抽出时间,谢谢你
for(RetrofitVariables item: myResponse) {
    MyRoomEntity myRoomEntity = new MyRoomEntity();
    myRoomEntity.setName( item.getName() );
    myRoomEntity.setDate( item.getDate() );
    myRoomEntity.setFrom( item.getFrom() );
    myRoomEntity.setUntil( item.getUntil() );

    myViewModel.insertDataVM( myRoomEntity );
}