Доброго времени суток. Осваиваю 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 уже нельзя. Пожалуйста подскажите почему выпадает эта ошибка, как ее устранить?
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();
}
});
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
У Шилдта заметил такое понятие как "область действия"Судя по тексту это то же самое что и "область видимости"
Как заставить работать Autowired, не создавая экземпляр класса сервиса из контекста? Использую Спринг Дата без Спринг БутКласс конфигурации:
Как создавать базу данных в указанной директории?