Использование ORM Realm с RecylerView

257
01 ноября 2017, 01:22

Доброго времени суток. Осваиваю ORM Realm. Столкнулся с непонятной мне ошибкой. Имеется класс адаптера для recyclerView, вот кусок кода

List<Dog> dogs = Collections.emptyList();
public void addDog(Dog dog) {
    dogs.add(dog);
    this.notifyDataSetChanged();
}
public RecycleViewAdapter(List<Dog> dogs) {       
    this.dogs = dogs;
}

Далее, вот сам класс Dog

import io.realm.RealmObject;
    public class Dog extends RealmObject{
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString(){
       return "!!! Name - "+name+" | Age - "+age;
    }
}

Добавление новых собак в бд происходит следующим образом

public void addDog() {
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            Dog dog = realm.createObject(Dog.class);
            dog.setName(nameDog.getText().toString());
            dog.setAge(Integer.parseInt(ageDog.getText().toString()));
        }
    });
}

, на данном этапе все ок. После того как добавили в бд, приходит уведомление об этом, я смотрю что изменилось и пытаюсь изменить данные в адаптере RecyclerView, но тут выпадает досадная ошибка вот код в котором приходят уведомления

final RealmResults<Dog> puppies = realm.where(Dog.class).lessThan("age", 7).findAll();
puppies.addChangeListener(new OrderedRealmCollectionChangeListener<RealmResults<Dog>>() {
        @Override
        public void onChange(RealmResults<Dog> dogs, @Nullable OrderedCollectionChangeSet changeSet) {
            int[] s = changeSet.getInsertions();
            adapter.addDog(dogs.last());
        }
    });

Ошибка возникает вот тут adapter.addDog(dogs.last());

java.lang.UnsupportedOperationException: This method is not supported by 'RealmResults' or 'OrderedRealmCollectionSnapshot'.

Получается что List dogs в конструкторе адаптара можно спокойно присваивать значение RealmResults. Но вот воспользоваться методом add у List dogs уже нельзя. Пожалуйста подскажите почему выпадает эта ошибка, как ее устранить?

Answer 1

RealmResults хранит изменяющуюся в реальном времени выборку из БД. Засим в неё и нельзя добавлять элементы, т.к. этим занимается сама БД. Вам вообще не нужно вручную добавлять что-то в список. он сам автоматически добавляет/удаляет элементы. Засим вам надо в onChange лишь уведомить адаптер о изменениях данных.

final RealmResults<Dog> puppies = realm.where(Dog.class).lessThan("age", 7).findAll();
puppies.addChangeListener(new OrderedRealmCollectionChangeListener<RealmResults<Dog>>() {
        @Override
        public void onChange(RealmResults<Dog> dogs, @Nullable OrderedCollectionChangeSet changeSet) {
            adapter.notifyDataSetChanged();
        }
    });
READ ALSO
Вопрос по терминологии Java

Вопрос по терминологии Java

У Шилдта заметил такое понятие как "область действия"Судя по тексту это то же самое что и "область видимости"

199
Работа Autowired в Spring Data JPA

Работа Autowired в Spring Data JPA

Как заставить работать Autowired, не создавая экземпляр класса сервиса из контекста? Использую Спринг Дата без Спринг БутКласс конфигурации:

281
Не запускается скомпиленный jar IDEA

Не запускается скомпиленный jar IDEA

Пользуюсь IDEAПриложение Swing

188
Как создавать базу данных в указанной директории SQLite Android

Как создавать базу данных в указанной директории SQLite Android

Как создавать базу данных в указанной директории?

180