What is the best way to build a complex NSCompoundPredicate?

后端 未结 1 2003
庸人自扰
庸人自扰 2021-02-06 00:34

I need to build an NSPredicate with many pieces of data. For example in SQL I would do something like the following:

SELECT * 
  FROM TRANSACTIONS
         


        
1条回答
  •  后悔当初
    2021-02-06 01:03

    What you need to do is to create a Predicate for each one of your clauses. For example let's break down your query:

    1. SELECT * FROM TRANSACTIONS
    2. WHERE CATEGORY IN (categoryList)
    3. AND LOCATION IN (locationList)
    4. AND TYPE IN (typeList)
    5. AND NOTE contains[cd] "some text"
    6. AND DATE >= fromDate AND DATE <+ toDate

    Based on this, you have 5 predicates (2-6). So let's work on them one by one.

     NSPredicate *inCategoryPredicate = [NSPredicate predicateWithFormat:@"Category IN %@", categoryList];
    
     NSPredicate *locationPredicate = [NSPredicate predicateWithFormat:@"Location IN %@", locationList];
    
     NSPredicate *typePredicate = [NSPredicate predicateWithFormat:@"Type IN %@", typeList];
    
     NSPredicate *notePredicate = [NSPredicate predicateWithFormat:@"Note contains[c] %@", @"Some Text"];
    
     NSPredicate *startDatePredicate = [NSPredicate predicateWithFormat:@"Date => @", fromDate];
    
     NSPredicate *endDatePredicate = [NSPredicate predicateWithFormat:@"Date <= @", toDate];
    

    Now you just need to join them into just one predicate: Apple's documentation states:

    You should structure compound predicates to minimize the amount of work done. Regular expression matching in particular is an expensive operation. In a compound predicate, you should therefore perform simple tests before a regular expression;

    This being said then you should start with the "easy" predicates first. So:

    NSCompoundPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects: startDatePredicate, endDatePredicate, inCategoryPredicate, locationPredicate, typePredicate, notePredicate];
    

    You can always get an idea of what the predicate (sql where) looks like if you NSLog it.

    0 讨论(0)
提交回复
热议问题