Обновите список, когда данные отфильтрованы из базы данных области в Android - PullRequest
0 голосов
/ 03 июля 2018

Я застрял с проблемой обновления списка при фильтрации списка элементов из базы данных области.

Что именно я пытаюсь сделать, это добавить некоторые пользовательские записи в таблицу, и когда пользователь нажимает кнопку фильтра, я запрашиваю базу данных области, чтобы отфильтровать результаты. Я могу напечатать результаты в журналах, но это не отражается в списке, так как прослушиватель изменений не вызывается из-за отсутствия изменений в базе данных. Может ли кто-нибудь подсказать, как отразить результаты, полученные с помощью запроса в списке?

Класс модели, как показано ниже.

public class UserModel extends RealmObject {

    @PrimaryKey
    private int id;

    @Required
    private String firstName;

    @Required
    private String lastName;

    private UserAddressModel userAddress;

    private int age;

    public UserAddressModel getUserAddress() {
        return userAddress;
    }

    public void setUserAddress(UserAddressModel userAddress) {
        this.userAddress = userAddress;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

Запрос на добавление записи в базу данных приведен ниже.

realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(@NonNull Realm realm) {
                int nextID;
                if (mUserModel == null) {
                    // increment index
                    Number num = realm.where(UserModel.class).max("id");

                    if (num == null) {
                        nextID = 1;
                    } else {
                        nextID = num.intValue() + 1;
                    }

                } else {
                    nextID = mUserModel.getId();
                }
                UserModel obj = new UserModel();
                obj.setId(nextID);
                obj.setFirstName(etFirstName.getText().toString().trim());
                obj.setLastName(etLastName.getText().toString().trim());
                obj.setAge(Integer.parseInt(etAge.getText().toString().trim()));

                UserAddressModel userAddressModel = new UserAddressModel();
                userAddressModel.setAddress(etAddress.getText().toString().trim());
                userAddressModel.setId(nextID);
                obj.setUserAddress(userAddressModel);
                realm.copyToRealmOrUpdate(obj);
              realm.beginTransaction();                  
                realm.addChangeListener(mOnDataChangeListener);
            }
        });

Запрос на фильтрацию записи приведен ниже.

RealmResults<UserModel> realmList = realm.where(UserModel.class).greaterThanOrEqualTo("age", 20).findAll();

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

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

Любая помощь будет принята с благодарностью. ТИА.

1 Ответ

0 голосов
/ 03 июля 2018

Хорошо, так что, наконец, нашли решение вопроса о после экспериментов с различными вещами. Все, что вам нужно сделать, - это вызвать метод updateData () объекта RealmRecyclerViewAdapter, который вы добавите в свой обычный просмотрщик.

Ниже приведен фрагмент кода.

realm.executeTransaction(new Realm.Transaction() {
                @Override
                public void execute(@NonNull Realm realm) {
                    userModels = realm.where(UserModel.class).greaterThanOrEqualTo("age", 20).findAll();
                }
            });
            dataListAdapter.updateData(userModels);

Главное, что следует иметь в виду в приведенном выше коде, это то, что вы должны уведомлять данные за пределами блока транзакции. Если это не сделано вне блока, приложение вылетает, сообщая, что вы не можете уведомить данные, когда транзакция выполняется.

Надеюсь, это кому-нибудь поможет.

Удачного кодирования !!!

...