【问题标题】:Realm recursive query - android领域递归查询 - android
【发布时间】:2019-07-08 18:28:37
【问题描述】:

我在 Realm 中有几个实例:FeedItem 的字段为 movie,类型为 MovieMovie 包含字段 showTimes,即 ListShowTime 对象。

-FeedItem:
  └ movie: Movie
      └ showTimes: List<ShowTime>
                           └ minPrice: Float

而且我需要查询所有包含MovieFeedItem 项目,其中至少包含一个Showtime 并具有minPrice 字段的给定值。

我可以使用这样的东西:

Realm.getDefaultInstance().where(FeedItem::class.java)
                                    .beginGroup()
                                    .equalTo(FeedItem::movie.name + "." + Movie::showTimes.name + "." + ShowTime::minPrice.name, 10f)
                                    .endGroup()
                                    .findAll()

showTimesList,我需要检查所有项目。

由于项目的现有架构,我无法查询所有项目FeedItem 然后过滤它们。所以我不能使用像这样的简单解决方案:

val feed = Realm.getDefaultInstance().where(FeedItem::class.java).findAll()

val filteredFeed = feed.filter { feedItem ->
    var b = false
    feedItem.movie.showTimes.forEach { showtime ->
        b = showtime.minPrice == 10f
    }
    b
}

解决我的问题的唯一方法是向 Realm 编写一个复杂的查询。请告诉我,我该怎么做?

【问题讨论】:

  • 为什么不能查询所有项目?
  • 因为查询耗时过长。我无法在此处使用findAllAsync() 和回调,因为这段代码已经代表Observable,解决我的任务的最简单方法是使用复杂查询(如果可能的话)。

标签: android database realm realm-list


【解决方案1】:

我找到了解决方案:How do I query RealmObject that have RealmList that contains specified value

所以,就我而言:

Realm.getDefaultInstance().where(FeedItem::class.java).beginGroup()
          .greaterThanOrEqualTo(FeedItem::movie.name
                        + "."
                        + Movie::showTimes.name
                        + "."
                        + ShowTime::minPrice.name,
                        10f)
           .endGroup()

【讨论】:

  • 注意::_.name 在使用 Proguard 后可能无法工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多