Почему обозреватель Room снова и снова добавляет одну и ту же сущность в базу данных? - PullRequest
0 голосов
/ 27 января 2019

Я получаю JSON данные, которые я создал и загрузил в Интернет, используя Retrofit.Я могу успешно извлекать и отображать данные, но когда я вставляю данные в базу данных Room, добавляется только самый последний объект JSON, столько раз, сколько кажется JSON объектов.

По моим log данным JSON извлекается целиком по методу Retrofits onResponse() - проблем нет.Но согласно методу observer в getAllData() из Room к Room добавляется только самый последний объект JSON.Наблюдатель срабатывает один раз для каждого JSON объекта, но каждый раз отображается только последний JSON объект.Я дважды проверил файл базы данных, используя Ridill SQLlte, и он подтверждает это:

enter image description here

Мой Log выглядит так:

//First observer shows nothing

D/TAG: OBSERVED

//JSON is retrieved, looks fine

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

//Observer is set again, shows last of the JSON objects

D/TAG: OBSERVED
D/TAG ROOM: MyRoomEntity{id=1, name='Martin', date='1/5/2015', from='15.30', until='16:00'}

//Observer fires again, now having added the last JSON object a second time

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'}

//Observer fires again, now adding the last object for a third time.

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 );

                    }
            }
        }

И мой observer выглядит так:

myViewModel.getAllDataVM().observe( this, new Observer<List<MyRoomEntity>>() {
        @Override
        public void onChanged(@Nullable List<MyRoomEntity> myRoomEntities) {
            //myAdapter.setList( myRoomEntities );

            Log.d("TAG", "OBSERVED");
            if(myRoomEntities != null) {
                for(MyRoomEntity item: myRoomEntities) {
                    Log.d("TAG ROOM ", "" + item.toString());
                }
            }
        }
    } );

Все выглядитхорошо в методе onResponse(), так почему же данные не добавляются должным образом в Room?Как мне получить все JSON объекты в Room, а не только последний?Что мне здесь не хватает?

Заранее спасибо за любую помощь!

1 Ответ

0 голосов
/ 27 января 2019

Вы не хотите повторно использовать объект вашей комнаты.Переместите

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