web-dev-qa-db-ja.com

Swift)でレルムオブジェクトをフィルタリングする

NSPredicateを使用してレルムデータベースをフィルタリングしようとすると、常に次のエラーが発生します。

プロパティ 'text'は、タイプ 'getType'のオブジェクト内のリンクではありません

レルムデータベースをフィルタリングして、特定のテキストが含まれているアイテムのみを表示したいと思います。これは私が試したものです:

let realm = try! Realm()
let predicate = NSPredicate(format: "typez.text.filter = 'special'")
let filterThis = realm.objects(Publication).filter(predicate)
print(filterThis)

私のモデルクラスの関連部分は次のとおりです。

class Publication: Object, Mappable {
    dynamic var id: Int = 0
    var typez = List<getType>()
    dynamic var url: String?
}

class getType: Object, Mappable {
    dynamic var text: String = ""
}
6
SoundShock

私は通常、NSPredicateを直接使用しません。代わりに、フィルターパラメーター内でインライン述語クロージャーを実行します。

let realm = try! Realm()
                     //Array of publications             
    let realmObjects = realm.objects(Publication)
    //any publication where .text property == special will be filtered. and filter out empty array
    let filterThis = realmObjects.filter({ $0.getType.filter({ $0.text == "special" } != [] ) })
    print(filterThis)
0
NSGangster

モデルクラスの関連部分は次のようになっているとおっしゃいました。

class Publication: Object, Mappable {
    dynamic var id: Int = 0
    var typez = List<getType>()
    dynamic var url: String?
}

class getType: Object, Mappable {
    dynamic var text: String = ""
}

私があなたを正しく理解しているなら、あなたはPublicationリストにtypeztextに等しいエントリを持つspecialインスタンスを見つけたいと思うでしょう。あなたはそれを次のように表現することができます:

let realm = try! Realm()
let result = realm.objects(Publication).filter("ANY typez.text = 'special'")
print(result)
10
bdash

実際に質問に答えていないので、ここで受け入れられた答えが好きではありませんでした...しかし、それは私が思っていた以上に私を助けました。可能な限り、NSPredicatesの代わりにクロージャを使用します。この質問に対する実際の回答は、@ NSGangsterの回答を少し変更したものである必要があります。

let realm = try! Realm()
    //Array of publications             
    let realmObjects = realm.objects(Publication)
    //any publication where .text property == special will be filtered. and filter out empty array
    let filterThis = realmObjects.filter({ $0.typez.filter({ $0.text == "special" } != [] ) })
    print(filterThis)

..またはそれに近いもの。

しかし、私が探していたものは少し異なっていました。マルチワード文字列の正確な単語をフィルタリングする方法が必要でした。「CONTAINS」でNSPredicateを使用すると、含まれているサブストリングと一致します。 「赤」を検索すると「フレッド」と一致します。 Realmはまだ「LIKE」または正規表現をサポートしていないため、クロージャーを使用することが私が仕事に取り掛かることができる唯一のことでした。

//I was going for a "related terms" result for a dictionary app
let theResults = terms.filter(
    {
        //Looking for other terms in my collection that contained the
        //title of the current term in their definition or more_info strings
        $0.definition.components(separatedBy: " ").contains(term.title) ||
        $0.more_info.components(separatedBy: " ").contains(term.title)
    }
)

私が検索に費やした時間と同じくらい多くのことで、うまくいけば、これは同様の問題を抱えている他の誰かを助けるでしょう。

1
Zig