2012-02-09 14 views
0

編集:コメント用に新しいラフテーブルモデルを追加します。これはあなたが念頭に置いていたものですか?Xcode:複雑な述語を使用してコアデータセットをフィルタリングする

enter image description here

私はまだコアデータセットのために検索フィルタをうまくしようとしています。 hereがついてしまったので、別の方法で問題に近づいています。

まず、私がやろうとしていることは以下の通りです:

  1. すべてのオブジェクトを繰り返し処理(tableViewModel.itemsでNSManageObject *オブジェクト)

  2. 'は、それぞれのすべてのサブエンティティオブジェクトを抽出オブジェクト 'を検索し、検索タームに対して検証します。

  3. 検索語が(それが既に存在しない場合)「autoSearchResults」に「オブジェクト」を追加し、サブエンティティに存在しない場合

次のように私のコードは次のとおりです。

NSLog(@"%s", __FUNCTION__); 

    NSMutableArray *startArray = [NSMutableArray array]; 
    NSMutableArray *filteredArray = [NSMutableArray array]; 

    for (NSManagedObject *object in tableViewModel.items) 
    { 
     NSLog(@"1 "); 

     NSSet *set1 = [object valueForKeyPath:@"people.name"]; 
     NSString *str1 = [[set1 allObjects] componentsJoinedByString:@", "]; 
     peopleSet = str1; 

     NSLog (@"peopleSet is %@ ", peopleSet); 

     NSLog(@"2 "); 
     NSSet *set2 = [object valueForKeyPath:@"place.name"]; 
     NSString *str2 = [[set2 allObjects] componentsJoinedByString:@", "];   
     placeSet = str2; 

     NSLog(@"3 "); 
     NSSet *set3 = [object valueForKeyPath:@"keyword.name"]; 
     NSString *str3 = [[set3 allObjects] componentsJoinedByString:@", "];   
     keywordSet = str3; 

     NSLog(@"4 "); 
     NSSet *set4 = [object valueForKeyPath:@"type.name"]; 
     NSString *str4 = [[set4 allObjects] componentsJoinedByString:@", "];   
     typeSet = str4;  

     NSLog(@"5 "); 
     NSSet *set5 = [object valueForKeyPath:@"symbol.name"]; 
     NSString *str5 = [[set5 allObjects] componentsJoinedByString:@", "];   
     symbolSet = str5; 

     NSLog(@"6 "); 

     NSLog (@"searchText is: %@ ", searchText); 

     myPredicate = [NSPredicate predicateWithFormat:@"(peopleSet contains[cd] %@) || (placeSet contains[cd] %@) || (keywordSet contains[cd] %@) || (typeSet contains[cd] %@) || (symbolSet contains[cd] %@)", searchText, searchText, searchText, searchText, searchText ]; 

     NSLog(@"7 ");  
     if (myPredicate) { 
      [startArray addObject:object]; 
      NSLog (@"startArray.count is %i ", startArray.count); 
     } 

     NSLog(@"8 "); 
     NSLog (@"startArray.count is %i ", startArray.count); 
     /* 
     if (startArray.count == 0) 
     { 
      NSLog(@"0"); 
     } else {    
      NSLog(@"9 "); 
      [filteredArray addObject: startArray]; 
      NSLog(@"10 "); 
      [startArray removeAllObjects]; 
      NSLog(@"11 "); 
     } 
     */ 

    }  


    //autoSearchResults = filteredArray; 
    return autoSearchResults; 
} 

私のテストでは、person.name "私"、 "あなた"、そして "母"の3つのオブジェクトがあります。その他のフィールドはすべてのオブジェクトで空白です。

今、各検索で選択されているオブジェクトの数を確認するのをやめています。本質的に、searchTextは検出されますが無視されます。つまり、ルーチンはsearchTextに "me"が含まれていると見なしますが、実際のテキストが "You"であるObjectを追加します。

それはこの例を減らすために役立つならば、私は、私に知らせてください..任意のヘルプをお願い申し上げます。..

答えて

2

このコードについて最も甚だしく間違ったことは、あなたが実際にあなたが作成した述語を使用していないということです。述部に対してオブジェクトをテストするには、述部でevaluateWithObject:を呼び出し、テストするオブジェクトを渡します。

しかし、それは "peopleSet"と他のすべての文字列が何であるか分からないため、まだ動作しません。ローカル変数をキーパスのように使用することはできません。

最後に、この構造は実際に述語の力を利用しません。あなたは正規表現のような述語を使用しています。実際にオブジェクトコレクションをフィルタリングするには、すべてのオブジェクトをテストする代わりに、コレクション自体にfilteredSetUsingPredicate:などのメソッドを使用します。

もちろん、管理対象オブジェクトモデルに一時的なプロパティを作成して、連結された名前リストを格納する必要がありますが、正しく行うと、このようなフィルタリングを行うとパフォーマンスが向上します。

+0

er。ありがとう..私は右が何かありますか? :) –

関連する問題