【问题标题】:Query nested Realm objects encapsulated in RealmList into RealmResults将封装在 RealmList 中的嵌套 Realm 对象查询到 RealmResults 中
【发布时间】:2015-08-04 10:28:38
【问题描述】:

我有以下 RealmObject:

public class City extends RealmObject {
    private String cityId;
    private RealmList<Street> streets;

    public String getId() {
        return cityId;
    }

    public void setCityId(String cityId) {
        this.cityId = cityId;
    }

    public RealmList<Street> getStreets() {
        return streets;
    }

    public void setStreets(RealmList<Street> streets) {
        this.streets = streets;
    }
}

现在有了 cityId,我需要查询特定城市的街道。怎么做?我所做的尝试是:

    Realm.getInstance(context).where(City.class).equalTo("cityId", someCityId, false)
         .findFirst().getStreets().where().findAll()

但这会导致异常。我需要在实现过滤的ListView 中显示街道,因此我需要将街道设为RealmResults 才能使用RealmBaseAdapter&lt;Street&gt;

【问题讨论】:

  • implementing filtering waaaaaa 等一下,你需要过滤什么? android Filter 接口和东西在后台线程上运行。它将导致RealmAccessedFromWrongThreadException 或其他任何名称。
  • 你是如何过滤的?这个问题不完整。
  • 好吧,它不是真正的过滤接口实现,只是一个调用updateRealmResults()的public void filter方法。这并不重要,问题主要是关于查询。它的作用 - 它使用 .contains("streetName", searchText, false) 进行搜索
  • 您遇到了什么异常?

标签: android realm realm-base-adapter


【解决方案1】:

正确的方法是在onCreate() 的Activity 中打开并在onDestroy()in your custom application class 中关闭一个打开的Realm 实例。

那么就可以使用这个realm实例来查询realm了

City city = realm.where(City.class).equalTo("cityId", cityId).findFirst();

然后您可以像访问任何其他列表一样访问RealmList&lt;T&gt;

RealmList<Street> streets = city.getStreets();

然后,您可以使用 recyclerview 获取 streets 列表中给定索引的视图。

【讨论】:

  • 是的,我知道,但我想使用RealmBaseAdapter,它不适用于RealmList&lt;T&gt;,但适用于RealmResults
  • 您实际上只需要使用这个stackoverflow.com/a/31188310/2413303 并将 RealmResults 替换为 RealmList,哈哈。
  • 好的,但我无法过滤街道以使列表可搜索,我需要从该 RealmList 创建一些 ArrayList,这就是我想要避免的。所以,就像我在我的问题的评论中指出的那样,主要问题是查询。我需要查询一个城市的街道列表。 ListView 是可选的,如果我知道如何单独查询没有 City 的城市街道,我可以管理它。
  • 您看,您在答案中写的所有内容都没有回答主要问题 - 如何查询城市的街道。不是有 RealmList 的城市,而是只有街道。
  • 哦!您可以将 cityId 放在导航属性 City 旁边的街道类中(这就是我们所做的),然后执行 realm.where(Street.class).equalTo("cityId", cityId).findAll().equalTo("name", "something").findAll() 或使用 realm.where(Street.class).equalTo("city.id", cityId).findAll();,尽管第二个速度较慢,所以我们放弃了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
相关资源
最近更新 更多