构建复杂的NSCompoundPredicate的最佳方法是什么?

时间:2010-10-17 23:09:15

标签: ios sql core-data nspredicate

我需要构建一个包含许多数据的NSPredicate。例如,在SQL中,我会执行以下操作:

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

我正在努力将其构建为NSPredicate,以便与Core Data一起使用。我已经阅读了文档......它只提供了简单的例子。如果有人能指出一个更复杂的例子,我当然会很感激。


好吧,我在这里找了两年的答案很多人都觉得有帮助。我的帖子被删除了。以下是解决方案的更新URL。

https://www.radeeccles.com/convert-sql-statement-to-an-nspredicate-for-use-with-core-data/

1 个答案:

答案 0 :(得分:9)

您需要做的是为每个子句创建谓词。例如,让我们分解您的查询:

  1. SELECT * FROM TRANSACTIONS
  2. WHERE CATEGORY IN(categoryList)
  3. AND LOCATION IN(locationList)
  4. AND TYPE IN(typeList)
  5. AND NOTE包含[cd]“some text”
  6. AND DATE&gt; = fromDate AND DATE&lt; + toDate
  7. 基于此,您有5个谓词(2-6)。让我们一个接一个地研究它们。

     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];
    

    现在你只需要将它们加入到一个谓词中:Apple's documentation states

      

    您应该构造复合谓词以最小化数量   完成工作。特别是正则表达式匹配是昂贵的   操作。因此,在复合谓词中,您应该执行   正则表达式之前的简单测试;

    这就是说,你应该首先从“简单”的谓词开始。所以:

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

    如果您使用NSLog,您可以随时了解谓词(sql where)的样子。