【RealmSwift】配列内の検索を行う

前回、RealmSwift で配列を扱う記事を書きましたが、それを検索できる方法を書き記します!
意外と有力な情報がなくて困りました。(検索能力の低さ

前提条件

前回例えたメモだとやりづらいので、図書館のシステム的なノリでいきます。

class Library: Object {
    let books = List()
}

class Book: Object {
    @objc dynamic var uniqueId = ""
    @objc dynamic var title = ""
    @objc dynamic var author = ""
    @objc dynamic var circulationRecrords = 0

    override static func primaryKey() -> String {
        return "uniqueId"
    }
}

Libraryクラス(図書館)で本(Bookクラス)を管理していると思ってください。
で!
検索方法として僕の中ですっきり書けるなと思ったのが、サブクエリです。

検索方法

例えば、岸川克己さんが書いた本を探したい場合。

do {
    let realmDB = try Realm()
    let objects = realmDB.objects(Library.self).filter("SUBQUERY(books, $book, $book.author = %@).@count >= 1", "岸川克己")
    print(objects)
} catch {
    print(error.localizedDescription)
}

貸し出し回数が100回以上の本を探したい場合。

do {
    let realmDB = try Realm()
    let objects = realmDB.objects(Library.self).filter("SUBQUERY(books, $book, $book.circulationRecrords >= 100).@count >= 1")
    print(objects)
} catch {
    print(error.localizedDescription)
}

ってな感じです。
SUBQUERYを「対象の配列、配列のオブジェクト、オブジェクトのプロパティ、条件」の順で定義してます!

さいごに

“swift realm list search” とかで検索すると、「取得したあとに map をかますと可能です」とかあったのですが、それはあまりやりたくなくて。笑
他にもスマートなやり方があれば教えてください!

違うよ!とかこういう方法あるよ!ってのがあれば教えてください。
では( ¯·ω·¯ )

Realm
スポンサーリンク

コメント