2016-04-25 1 views
5

を持つオブジェクト:フィルタリングレルムは<code>NSPredicate</code>を使って自分のレルムのデータベースをフィルタ処理しようとしたとき、私はいつも次のエラーを取得するスウィフト

Property 'text' is not a link in object of type 'getType'

私はその中のいくつかの特定のテキストを持っているアイテムのみを表示するように私のレルムデータベースをフィルタリングします。これは私が試したものです:

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

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

私は通常、私は、フィルタ内のインライン述語の閉鎖を行う代わりに、直接NSPredicateのを使用していない
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 = "" 
} 
+0

あなたの 'Publication'オブジェクトの実装は何ですか? –

+0

はここにあります:http://stackoverflow.com/questions/36835805/objectmapper-get-array-of-one-item-within-json – SoundShock

答えて

0

パラメター。私が正しくあなたを理解

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 = "" 
} 

場合、あなたはtextとのtypezリストのエントリを持っているPublicationインスタンスを見つけたい:あなたはあなたのモデルクラスの関連部分がとても似ていることを述べた

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

私はこの[記事](https://www.weheartswift.com)をお勧めします/ higher-order-functions-map-filter-reduce-more /)filter/map/reduceで '$ 0.property'クロージャ構文を使用する方法を含む、新しい素早い配列メソッドを使ってもっとクールなテクニックを学ぶ – NSGangster

+0

'((_) - > _) '型の引数リストで' filter 'を呼び出すことはできません。私がクラスEquatableを作るとき、それは冗長な適合であると言います。 – SoundShock

+0

'.text'プロパティが文字列の場合、equateableを使う必要はありません。キャストしてみてください。私は私の答えを更新します。 – NSGangster

9

specialに等しい。あなたはそのように表現することができます。

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

これまでに試しましたが、エラーが発生しました。 '配列プロパティを含むキーパスは集合演算を使用する必要があります。 ' – SoundShock

+1

私の間違いです。 'List'内のいくつの要素が、一致すると見なされるオブジェクトを含むかを指定するには、' ANY'のような修飾子を含める必要があります。私は答えを更新しました。 – bdash

1

それは実際に質問に答えていないので、私はここに受け入れ答えを好きいませんでした...しかし、それは私が実現よりも、より多くのを助けました。可能な限り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を使用すると、含まれている部分文字列に一致します。 「赤」の検索は「フレッド」と一致します。レルムは、そのクロージャを使用して、私は仕事に得ることができる唯一のものだった、まだ「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

レルムは初期のv2.1.2時点で「LIKE」をサポートしています。また、パフォーマンスやメモリのオーバーヘッドが悪化し、Realmが変更されたときに結果のコレクションが自動的に更新されず、機能にアクセスできない場合など、閉鎖に基づいたフィルタリングにはいくつかの欠点があります。通知のような。 – bdash

関連する問題