2016-05-26 5 views
1

から文字列要素が含まれているコアデータからオブジェクトを取得するために 私の実体を述語を形成するために、どのように「フォーム」は、次のようになります。、私はコアデータからオブジェクトを取得するための述語を作成する必要がアレイ

@interface EEForm (CoreDataProperties) 
@property (nullable, nonatomic, retain) NSDate *date; 
@property (nullable, nonatomic, retain) NSString *descriptor; 
@property (nullable, nonatomic, retain) NSString *location; 
@property (nullable, nonatomic, retain) NSMutableSet<Participants *> *participants; 

エンティティ「参加者」は、そのように見える:

@interface Participants (CoreDataProperties) 

@property (nonatomic, assign) NSInteger indexRow; 
@property (nullable, nonatomic, retain) NSString *participant; 
@property (nullable, nonatomic, retain) EEForm *form; 

を私は(この配列は、文字列オブジェクトで構成され、それがどのようなユーザーが選択の依存に変更指定された配列からすべてのオブジェクトが含まれていること、参加者フィールドのベース上のオブジェクトを取得したいです)。 フェッチ要求はFetchResultControllerによって実行されます。私はそれを初期化して述語を設定しました。

私はこのようにしましたが、指定された配列から少なくとも1つのオブジェクトを含むすべてのオブジェクトを含みます。

- (NSFetchedResultsController *)fetchResultController { 
    if(_fetchResultController != nil) { 
     return _fetchResultController; 
    } 

    NSPredicate *lPredicate = [NSPredicate predicateWithFormat:@"ANY participants.participant IN %@", _selectedForPredicatel]; 
    NSFetchRequest *lRequest = [[NSFetchRequest alloc]init]; 
    [lRequest setPredicate:lPredicate]; 
    NSEntityDescription *lEntity = [NSEntityDescription entityForName:@"Form" inManagedObjectContext:self.managedObjectContext]; 
    [lRequest setEntity:lEntity]; 
    [lRequest setFetchBatchSize:10]; 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"date" ascending:YES]; 
    NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor, nil]; 
    [lRequest setSortDescriptors:sortDescriptors]; 
    NSFetchedResultsController *fetchResultController = [[NSFetchedResultsController alloc]initWithFetchRequest:lRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 
    fetchResultController.delegate = self; 
    self.fetchResultController = fetchResultController; 
    NSError *error = nil; 
    if(![[self fetchResultController] performFetch:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
    return fetchResultController; 
} 

述語を適切に設定して、指定された配列のすべての要素を含むオブジェクトをフィルタする方法を教えてください。

はEDIT: 配列述語のために使用されるようになっています

_selectedForPredicatel = [[NSMutableArray alloc]initWithObjects:@"Child",@"Adult", @"Group of people", @"Family", @"Teenager", nil]; 

たびにユーザーがどのフィルタ「フォーム」オブジェクトによって、この配列が更新されたパラメータを選択し、私は行われるフェッチ要求を必要としますそれによると。したがって、「Form」に参加者が含まれている場合は、@「Child」、@「Adult」が配列_selectedForPredicatelにあります。@ "Adult"、@ "Group of people"フェッチされる。 _selectedForPredicatel配列の両方の要素を含む 'Form'のみを取得する必要があります。 アドバイスをいただき、ありがとうございます。代わりに、ANYの

+0

'participant'属性に同じ値を持つ複数の' Participant'がありますか? – pbasdf

+0

@pbasdf同じ値を持つ多くの参加者がいる可能性があります。 – Melany

答えて

1

ユーザーの選択ごとに、一致するparticipant属性を持つParticipantが少なくとも1つある場合は、フォームを含める必要があります。

参加者の名前が(少なくともFormの場合)一意である場合は、一致を数え、ユーザーの選択数と比較することができます。しかし、いない場合、あなたは別に、ユーザーの選択の各述語テストを作成し、一つの大きな述語に結果を結合する必要があります。

NSPredicate *template = [NSPredicate predicateWithFormat:@"(SUBQUERY(participants, $p, $p.participant == $SELECTED)[email protected] > 0)"]; 
NSMutableArray *predicateArray = [NSMutableArray array]; 
for (NSString *testString in _selectedForPredicatel) { 
    NSDictionary *subsVars = @{@"SELECTED" : testString}; 
    NSPredicate *testPredicate = [template predicateWithSubstitutionVariables:subsVars]; 
    [predicateArray addObject:testPredicate]; 
} 
NSPredicate *finalPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicateArray]; 
NSLog(@"finalPredicate is %@", finalPredicate); 
NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"ListEntity"]; 
fetch.predicate = finalPredicate; 

ここtemplateすることは、ユーザーの選択のためのプレースホルダとして$SELECTEDを使用してダミーの述語であります。 forループは、これを使用して、ユーザーの選択ごとに述部を作成し、それを可変配列に追加します。最後の述部は、AND節を使用して述部の配列を合成することによって構築されます。

これは非常に面倒です(最終的な述語は十分に悪く、基礎となるSQLは恐ろしいものです)ので、パフォーマンスは暗くなる可能性があります。

+0

ありがとうございました!!!私はそれを管理することができなかったか、長い時間)) – Melany

1

あなたはALLを使用することができます。

NSPredicate *lPredicate = [NSPredicate predicateWithFormat:@"ALL participants.participant IN %@", _sortByParticipants]; 

すべてのオブジェクトは、あなたのコレクションである場合、これはチェックします。

+1

非常にお返事ありがとうございます。残念ながら、例外がスローされました:未知の例外「NSInvalidArgumentException」、原因: 'サポートされていない述語ALL participants.participant IN ' – Melany

関連する問題