java.lang.UnsupportedOperationException:仅当元素类型实现RealmModel时,此功能才可用

时间:2019-06-25 09:23:46

标签: java realm realm-list

在我的应用中,我将 Arraylist 保存到realmlist,并且该列表已保存到realm数据库,所以现在在运行时,当我尝试通过一些搜索查询获取结果时,我 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 :(得分:0)

您的问题出在setVendor上,您在对象外部使用了非托管的RealmList,并在非Realm对象(在本例中为原始String)上使用了查询。

setVendor中,您目前不能重新分配列表的值;该列表已经存在,因此您必须修改其内容。

RealmList仅应在受管理的对象内使用。您不应该尝试在对象之外使用它们。

尽管尝试将RealmList封装在对象中并提供访问器是令人钦佩的,但这实际上并没有帮助。您会发现Realm示例始终使用公共成员。您可以根据需要将它们设置为私有,但是访问器随后应隐藏对Realm的实现和依赖性,并为您提供应用程序层所需的必要操作。

因此,从模型中删除getVendorsetVendor方法。

接下来,添加方法来完成您的工作。例如

public class Vendordb extends RealmObject {

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

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

您的“创建”部分将变为:

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);
  }
} );

我不太确定您要在最后的“搜索”部分中尝试做什么。您有一个字符串列表,但正在对原始类型执行“ where”操作-这可能是导致生成运行时错误的原因。考虑一下要从字符串列表中拉出的内容,然后添加类似的方法来为您查找(也许只是对contains的调用)。