领域中的两个参数查询领域

时间:2018-05-18 08:20:17

标签: android kotlin realm

我有两个对象:作者和书。

@RealmClass
class Author {
    @PrimaryKey
    val id: String?
    val books: RealmList<Book> = RealmList()
}

@RealmClass
class Book {
    @PrimaryKey
    val id: String?
    val countPages: Long
    val genre: String
}

我在领域有数据,如下:

{
    "id": "author1",
    "books": [
        {
            "id": "book1",
            "countPages": 100,
            "genre": "fantasy"
        },
        {
            "id": "book2",
            "countPages": 150,
            "genre": "non-fiction"
        }
    ]
}

我想找到有书的作者,这些书有特定的类型和特定的页面数。如果我写这样的话:

realmQuery.where().equalsTo("books.countPages", 100).equalsTo("books.genre", "non-fiction").find()

我会找一位id = author1的作者。但事实并非如此,我应该得到空名单。

如何编写查询来实现此目的?

1 个答案:

答案 0 :(得分:1)

链接查询会转换为has at least one of ___ where X is true,所以

.equalsTo("books.countPages", 100).equalsTo("books.genre", "non-fiction")

表示&#34;作者至少拥有一本具有countPages 100的书,并且至少有一本具有类型非小说的书#34; - 这是真的!但这不是你想要的。

有两种方法可以解决这个问题:

1。)查询现有结果集以获得更小的&#34;结果:

realmQuery.where()
          .equalTo("books.countPages", 100)
          .findAll()
          .equalTo("books.genre", "non-fiction")
          .findAll()

2.)在Books上执行查询,并通过链接对象反向关系访问作者

@RealmClass
class Book {
    @PrimaryKey
    val id: String?
    val countPages: Long
    val genre: String

    @LinkingObjects("books")
    val authors: RealmResults<Author>? = null
}

val books = realm.where<Book>().equalTo("countPages", 100).equalTo("genre", "non-fiction").findAll();
// these books have `authors` field that contains the author