Как очистить RealmResults <> определенного запроса при фильтрации по области в Android? - PullRequest
1 голос
/ 06 февраля 2020

Я применяю фильтры к области, используя RealmResults <>.

Я начинаю делать так -

RealmResults<data> filteredRealmResults;
List<data> tranfilteredlist;

private OrderedRealmCollectionChangeListener<RealmResults<data>> filteredTransChangeListener =
            new OrderedRealmCollectionChangeListener<RealmResults<data>>() {
                @Override
                public void onChange(RealmResults<data> results, OrderedCollectionChangeSet changeSet) {

                    Log.d("realm", "filteredRealmResults.size():" + filteredRealmResults.size());

                    tranfilteredlist = results;
                    initFilterAdapter();

                }
            };

Теперь я хочу удалить filteredRealmResults. Я так и сделал -

void deleteFilteredRealmResults() {

        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {

                // Delete all matches
                filteredRealmResults.deleteAllFromRealm();
            }
        });
    }

После этого мои данные в области были удалены. Поэтому я просто пытаюсь удалить tranfilteredlist, но он выдает исключение, что он не поддерживает .clear();

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

Я прочитал Этот класс содержит все совпадения RealmQuery для данной области. Объекты не копируются из Realm в список RealmResults, а вместо этого просто ссылаются из RealmResult. Это экономит память и увеличивает скорость.

1 Ответ

1 голос
/ 06 февраля 2020

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

Как только вы вызовете filteredRealmResults.deleteAllFromRealm, он очистит объект внутренних результирующих элементов (который содержит элементы) и, как вы знаете, результирующие объекты являются ссылками, поэтому данные будут также удалены из базы данных области. Следовательно, нет необходимости вызывать clear для объекта RealmResults.

Вы можете проверить это, вызвав filteredRealmResults.size() после удаления, он вернет 0.

Я просто пытаюсь удалить transfilteredlist, но он выдает исключение, которое он не поддерживает .clear ();

Это ожидаемое поведение, поскольку clear было объявлено устаревшим , поэтому не используйте это.

Почему устарел?

  1. deleteAllFromRealm автоматически очищает список, поэтому нет необходимости вызывать его снова явно.
  2. Вызов clear на RealmResults объект приведет к удалению данных из базы данных, может вызвать непредвиденное поведение, если пользователь не знает об этом, поэтому API изменяется, чтобы избежать непредвиденного поведения.
...