java.lang.UnsupportedOperationException: эта функция доступна только тогда, когда тип элемента реализует RealmModel - PullRequest
0 голосов
/ 25 июня 2019

В моем приложении я сохраняю Arraylist в список областей, и этот список сохраняется в базе данных областей, поэтому теперь во время выполнения , когда я пытаюсь получить результат с помощью какого-либо поискового запроса, который он мне дает java.lang.UnsupportedOperationException: This feature is available only when the element type is implementing RealmModel.

Я не могу понять, что здесь не так. Любая помощь будет оценена!

Вот мой класс царства:

public class Vendordb extends RealmObject {
    public RealmList<String> getVendor() {
        return vendor;
    }

    public void setVendor(RealmList<String> vendor) {
        this.vendor = vendor;
    }
    RealmList<String> vendor = new RealmList<>();
}

Это код для создания списка:

final List<String> vendors = macvendorDatabaseAccess.getvendors();
            final RealmList<String> vend = new RealmList<>();
            vend.addAll( vendors );
            macvendorDatabaseAccess.close();
                realm.executeTransaction( new Realm.Transaction() {
                    @Override
                    public void execute(Realm realm) {
                        Vendordb vendordb = realm.createObject( Vendordb.class );
                        vendordb.setVendor(vend);
                    }
                } );

// В этом куске кода я получаю ошибку:

 Vendordb vendordb = realm.where(Vendordb.class).findFirst();
                RealmList<String> vendor = vendordb.getVendor();
                RealmResults<String> filteredMembers = vendor.where().equalTo("mac", identifier).findAll();
               if (!filteredMembers.isEmpty()) {
                   holder.vendor.setText( filteredMembers.get( 0 ).toString() );
               }

1 Ответ

0 голосов
/ 26 июня 2019

Ваша проблема в setVendor, вы используете неуправляемый RealmList вне объекта и используете запрос к не-Realm-объекту (в данном случае примитивную строку).

В setVendor вы не можете переназначить значение списка в это время; список уже существует, поэтому вы должны изменить его содержимое.

RealmList следует использовать только в пределах объекта, которым он управляется. Вы не должны пытаться использовать их вне объекта.

Хотя замечательно пытаться инкапсулировать RealmList в объекте и предоставлять средства доступа, на самом деле это не помогает; вы заметите, что примеры Realm всегда используют открытых участников. Вы можете сделать их приватными, если хотите, но ваши методы доступа должны затем скрыть реализацию и зависимость от Realm и предоставить вам необходимые операции, необходимые вашему прикладному уровню.

Итак, удалите методы getVendor и setVendor из вашей модели.

Далее, добавьте методы, чтобы сделать вашу грязную работу. Э.Г.

public class Vendordb extends RealmObject {

  RealmList<String> vendor = new RealmList<>();

  public void addVendors(List<String> vendors)
  {
    this.vendor.addAll(vendors);
  }
}

Ваш раздел 'create' становится:

final List<String> vendors = macvendorDatabaseAccess.getvendors();
macvendorDatabaseAccess.close();

realm.executeTransaction( new Realm.Transaction() {
  @Override
  public void execute(Realm realm) {
    Vendordb vendordb = realm.createObject( Vendordb.class );
    vendordb.addVendors(vendors);
  }
} );

Я не совсем уверен, что вы пытаетесь сделать в заключительной части 'поиска'. У вас есть список строк, но вы выполняете «где» для примитивного типа - это, вероятно, то, что генерирует вашу ошибку во время выполнения. Подумайте, что вы хотите вытащить из списка строк, а затем добавьте аналогичный метод, чтобы найти его для вас (возможно, просто вызов contains).

...