构build一个复杂的NSCompoundPredicate的最好方法是什么?
我需要用许多数据构build一个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
我正在努力如何build立一个与核心数据一起使用的NSPredicate
。 我已阅读文档…只提供简单的例子。 如果有人能指点我一个更复杂的例子,我当然会很感激。
那么我在这里有两年的答案,很多人觉得有用。 我的post被删除了。 这里是解决scheme的更新url。
https://www.radeeccles.com/convert-sql-statement-to-an-nspredicate-for-use-with-core-data/
你需要做的是为你的每一个子句创build一个谓词。 例如,让我们分解您的查询:
- select*从交易
- (categoryList)中的类别
- 和位置(locationList)
- AND TYPE IN(typeList)
- AND NOTE包含[cd]“一些文本”
- AND DATE> = fromDate AND DATE <+ toDate
基于此,你有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];
现在你只需要将它们join到一个谓词中: 苹果的文档指出 :
您应该构造复合谓词以最大限度地减less完成的工作量。 正则expression式匹配尤其是一个昂贵的操作。 在复合谓词中,你应该在正则expression式之前执行简单的testing;
这就是说,那么你应该先从“易”谓词开始。 所以:
NSCompoundPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects: startDatePredicate, endDatePredicate, inCategoryPredicate, locationPredicate, typePredicate, notePredicate];
如果你使用NSLog,你总是可以知道谓词(sql where)是什么样的。
- 从CoreData中删除条目后如何处理包含CoreData Entry的NSMutableArray,显示为“<fault>”
- 使用核心数据swift ios将实体的所有属性获取到tableview中的行中的标签
- 从另一个方法中删除NSManagedObjectContext中的对象
- 核心数据提取请求的复杂sorting
- 使用核心数据与每个实体的许多图像?
- 核心数据错误:_Unwind_Resume从图像CoreData中的函数_PFFaultHandlerLookupRow调用
- 奇怪的父/子NSManagedObjectContext现象
- XCTest和CoreData
- 如何在使用CoreData时与Watch OS 2共享数据以显示在WKInterfaceTable中