Проблема с установкой RealmList‹Object› для моего элемента базы данных с использованием Realm для Android

Сначала вызываю функцию, которая вернет моего пользователя из базы, а после получаю свой обновленный профиль из WS, и пытаюсь изменить список друзей из базы.

Способ получить моего пользователя:

 public UserRecord getMyUser(){
    String userId = PSLocationCenter.getInstance().pref.getUserId(context);
    RealmResults<UserRecord> completed = realm.where(UserRecord.class).equalTo("id" , userId).findAll();
    if(completed.size() > 0){
        return completed.get(0);
    }else{
        return null;
    }
}

После этого это WSCall, из которого я получаю данные, и пытаюсь изменить список друзей:

user = UserRecordDBFactory.getInstance(PSProfileActivity.this).getMyUser();
WSCalls.getData("/api/users/" + user.getId() + "/friends", PSProfileActivity.this, loader, new JsonCallback() {
                        @Override
                        public void onResponse(JSONObject jsonObject) {
                            try {
                                FriendsResponse friendsResponse = JsonUtil.jsonToObject(jsonObject.toString(), FriendsResponse.class);
                                Log.i("","friends response: " + friendsResponse.toString());
                                Log.i("","friends response: " + friendsResponse.getFriends());
                                friends = friendsResponse.getFriends();
                                Log.i("","friends after being given the response: " + friends.size());
                                Log.i("","friends USER after being given the response: " + user);
                                Log.i("","friends USER after being given the response: " + user.getId());
                                Realm realm = Realm.getInstance(PSProfileActivity.this);
                                realm.beginTransaction();
                                user.setFriends(friends);
                                Log.i("", "friends set to user: " + friends);
                                realm.commitTransaction();
                                UserRecordDBFactory.getInstance(PSProfileActivity.this).updateMyUser(user);
                                Log.i("", "friends set to user in REALM: " + friends);
                                setHeaderAndData(profile);
                            } catch (Exception e) {
                                Utils.appendLog("onresume friends activ error: " + e.getMessage());
                                Log.e("", "getProfileData - JsonException: " + e.getMessage());
                            }
                        }
                    });

Это журнал, который я возвращаю:

03-10 18:02:13.826  23882-23882/nl.hgrams.passenger I/﹕ friends response: nl.hgrams.passenger.model.FriendsResponse@1635594a
03-10 18:02:13.827  23882-23882/nl.hgrams.passenger I/﹕ friends response: RealmList@[254263483,474495448,561029425,720879638,789032343,921901956,66920301,229099426,948931635,877161456,1062815081,73317358,28096655,610293532,322424613,192850170,667307691]
03-10 18:02:13.827  23882-23882/nl.hgrams.passenger I/﹕ friends after being given the response: 17
03-10 18:02:13.829  23882-23882/nl.hgrams.passenger I/﹕ friends USER after being given the response: UserRecord = [{username:},{first_name:Alin},{last_name:Red},{email:[email protected]},{token:8596bcb0243cc16b6f16e5e90210754c65f8e58ca426daecd3d7220d5092e24d},{id:6},{bio:Red},{image:/media/user_image/8b824838993f3c5aae2bfb650851e7e1.jpe},{nrTrips:0},{distance:0},{last_destination:},{friends:RealmList<Friend>[0]},{activityLog:null},{recents:RealmList<SearchData>[0]},{updateRecents:false}]
03-10 18:02:13.829  23882-23882/nl.hgrams.passenger I/﹕ friends USER after being given the response: 6
03-10 18:02:13.836  23882-23882/nl.hgrams.passenger E/﹕ getProfileData - JsonException: Attempt to invoke virtual method 'long io.realm.internal.Row.getIndex()' on a null object reference

Это мой сеттер из класса RealmObject:

public void setFriends(RealmList<Friend> fr) {
    Log.i("","before in set friends");
    friends = fr;
    Log.i("","after in set friends");
}

И он не регистрирует ни один из журналов от геттера. Как видите, я также сделал журналы, чтобы проверить, являются ли пользователи или друзья нулевыми, но это не так. Любая идея, что я делаю неправильно здесь? Увидев, что он долго пытался io.realm.internal.Row.getIndex(), я предполагаю, что он находит пользователя каким-то образом нулевым, но почему?

Вот что делает функция jsonToObject:

public static <T> T jsonToObject(String json, Class<T> toClass) throws Exception {
    if (instance == null) {
        instance = new JsonUtil();
    }
    return instance.gson.fromJson(json, toClass);
}

Где находится экземпляр gson:

gson = new GsonBuilder()
            .setExclusionStrategies(new ExclusionStrategy() {
                @Override
                public boolean shouldSkipField(FieldAttributes f) {
                    return f.getDeclaringClass().equals(RealmObject.class);
                }

                @Override
                public boolean shouldSkipClass(Class<?> clazz) {
                    return false;
                }
            })
            .create();

И у меня есть только RealmObjects внутри моего UserRecord, я не использую обычные объекты


person rosu alin    schedule 10.03.2015    source источник
comment
Что делает JsonUtil.jsonToObject(jsonObject.toString(), FriendsResponse.class)_ Ошибка, которую вы получаете, скорее всего, связана с тем, что вы смешиваете RealmObjects и автономные объекты. Чтобы user.setFriends() работал, они также должны быть правильными объектами RealmObject, например. с помощью Realm.copyToRealm.   -  person Christian Melchior    schedule 11.03.2015
comment
@ChristianMelchior внес изменения и включил код функции jsonToObject. Также проверил и есть нормальные объекты. О чем я думал, так это о том, что я создал объекты, но на самом деле не копировалToRealm, так как в этих объектах я не хочу хранить. Может ли это быть источником проблемы?   -  person rosu alin    schedule 11.03.2015
comment
Список реалмов из элемента — это список реалмов из резервной копии, а другой — автономный список реалмов. Как я могу сделать мой автономный список реалмов резервным списком реалмов?   -  person rosu alin    schedule 11.03.2015


Ответы (2)


Я считаю, что вы можете избежать перебора всех своих друзей и добавить их по отдельности, если сделаете что-то вроде этого:

    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            List<Friend> realmFriends = realm.copyToRealmOrUpdate(friends);
            RealmList<Message> realmListFriends = new RealmList<>(realmFriends.toArray(new Friend[friends.size()]));
            user.setFriends(realmListFriends);
        }
    });

РЕДАКТИРОВАТЬ: Чтобы было ясно, вы все еще перебираете своих друзей внутри метода Collection.toArray(). Сложность по-прежнему O(n), но код стал более читабельным.

person frankelot    schedule 03.08.2016

Сделал это так, и это сработало:

WSCalls.getData("/api/users/" + user.getId() + "/friends", PSProfileActivity.this, loader, new JsonCallback() {
                        @Override
                        public void onResponse(JSONObject jsonObject) {
                            try {
                                FriendsResponse friendsResponse = JsonUtil.jsonToObject(jsonObject.toString(), FriendsResponse.class);
                                Log.i("","friends response: " + friendsResponse.getFriends());
                                Realm realm = Realm.getInstance(PSProfileActivity.this);
                                friends = friendsResponse.getFriends();
                                for (UserRecord friend : friends) {
                                    friend.setDistanceTraveled(friend.getStats().getDistanceTraveled());
                                }
                                Log.i("","first begin transaction");
                                realm.beginTransaction();
                                List<UserRecord> list = realm.copyToRealmOrUpdate(friends);
                                realm.commitTransaction();

                                Log.i("", "second begin transaction");
                                realm.beginTransaction();
                                user.getFriends().clear();
                                for (UserRecord friend : list) {
                                    user.getFriends().add(friend);
                                }
                                realm.commitTransaction();
                                Log.i("", "third begin transaction");

                                setHeaderAndData(profile);
                            } catch (Exception e) {
                                Utils.appendLog("onresume friends activ error: " + e.getMessage());
                                Log.e("", "getProfileData - JsonException: " + e.getMessage());
                            }
                        }
                    });

Нужно сначала скопировать список в область, а затем использовать управляемые элементы для добавления моего предмета, чтобы затем зафиксировать мой предмет.

person rosu alin    schedule 18.03.2015