Android Realm - findAll возвращает объекты с нулевыми параметрами

Мне нужно сделать простой запрос в Realm, получить список объектов MyModel, а затем использовать его где-то еще в моем приложении. Бывает, что когда я запрашиваю Realm, каждый объект имеет нулевые значения, но toString возвращает ожидаемые значения.

Модель:

@RealmClass
public class MyModel extends RealmObject implements Serializable {

public static final String KEY_MODEL = "key_myModel";

@PrimaryKey
private int id;
private String myStr;
private int myInt;

//.... getters and setters

@Override
public String toString() {
    return "id = " + id
            + "\nmyStr = " + myStr
            + "\nmyInt = " + myInt;
}

}

Как сохранить значение:

public static void storeModel(MyModel model) {
        Realm realm = Realm.getDefaultInstance();
        realm.beginTransaction();
        realm.copyToRealm(model);
        realm.commitTransaction();
    }

Как получить объекты:

public static RealmList<MyModel> getNewElementsFromIndex(int indexFrom) {
        Realm realm = Realm.getDefaultInstance();
        RealmResults<MyModel> allValues = realm.where(MyModel).greaterThan("id", indexFrom).findAll();

        RealmList<MyModel> finalList = new RealmList<MyModel>();
        finalList.addAll(allValues.subList(0, allValues.size()));
        return finalList;
    }

Когда я вызываю getNewElementsFromIndex(value), я получаю список элементов, но все элементы в этом списке имеют параметр myStr = null и myInt = 0.

Что я делаю не так?


person Bugdr0id    schedule 25.08.2016    source источник
comment
Почему бы вам просто не вернуть allValues?   -  person Tim    schedule 25.08.2016
comment
Без особой причины ... У меня все тот же результат - › Нулевые параметры внутри объекта.   -  person Bugdr0id    schedule 25.08.2016
comment
1.) вы должны использовать RealmResults, 2.) вы не закрываете экземпляр Realm, который вы открываете с помощью getInstance(), 3.) то, что вы описываете, является задокументированным и ожидаемым поведением.   -  person EpicPandaForce    schedule 25.08.2016
comment
@EpicPandaForce, если я закрываю экземпляр Realm, а затем выполняю .isEmpty() в возвращаемом списке, я получаю сообщение об ошибке: этот экземпляр Realm уже закрыт, что делает его непригодным для использования.   -  person Bugdr0id    schedule 25.08.2016
comment
Это потому, что это не то место, где вы должны открывать его в первую очередь. Он находится в разделе документации с рекомендациями: realm .io/docs/java/latest/   -  person EpicPandaForce    schedule 25.08.2016


Ответы (1)


Для объектов управляемой области данные не копируются в поля, вы получаете их через вызовы прокси-геттера/сеттера.

Следовательно, тот факт, что поля имеют значение null, а toString() показывает значения, является полностью ожидаемым и хорошо задокументированным поведением.

Чтобы увидеть значения, вы должны добавить часы для методов получения.

См. документацию.

person EpicPandaForce    schedule 25.08.2016