我有一个Core Data模型,其中Task实体包含ExcludedDay实体的可选多对多关系ExcludedDays.ExcludedDay的一个属性是day,它是一个NSDate对象.ExcludedDay实体与Task实体具有反向强制关系.
为了获取指定日期的任务,我需要确保指定的日期不会显示为任何ExludedDay实体的day属性.
我开始尝试了
NSPredicate *dayIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"ALL excludedDays.day != %@", today];
Run Code Online (Sandbox Code Playgroud)
但是,尽管文档说的是,ALL不起作用,应用程序抛出异常:由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'不支持的谓词.
在此论坛中发布相同的问题后,我能够在各种人的帮助下设计以下谓词:
NSPredicate * dayIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"excludedDays.@count == 0 || (excludedDays.@count > 0 && NONE excludedDays.day == %@))", today];
Run Code Online (Sandbox Code Playgroud)
虽然这首先起作用,但我刚刚发现,只有当ExcludedDay实体仅包含一天时,这才有效.一旦ExcludedDay实体包含同一任务的一天以上,该谓词就会停止工作.因此,即使当天在ExcludedDay实体中显示为一天,也会选择一天的任务,这当然是错误的.问题与作为NSDate对象的属性日无关:用相应的NSString替换day或者用整数替换,我仍然面临同样的问题和不正确的行为.
在这种情况下实现谓词的正确方法是什么?在使用核心数据时,这可能是与任何聚合运算符相关的错误吗?提前谢谢你,这让我发疯了.
我有一个NSArrayController,companiesController绑定到顶级Core Data实体,Companies.
A Company有很多Department,Department有很多Employee; 这些由1对多关系表示,departments和employees.
基于我认为的属性salary,Employee我可以动态地根据UI调用的方法中的工资进行过滤:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY departments.employees.salary < %@", [NSNumber numberWithInt:23000]];
[companiesController setFilterPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)
唉,这给了我错误:-[NSCFSet compare:]: unrecognized selector sent to instance.
我试图获取子实体中属性的平均值,同时还尝试仅包含一组选择的记录.
我的Core Data模型中有两个实体:Invoice和InvoiceDetail.
Invoice:<br>
invoiceNum - attribute<br>
invoiceDate - attribute<br>
invoiceDetails - one-to-many relationship to InvoiceDetail
InvoiceDetail:<br>
itemAmount - attribute<br>
itemType - attribute<br>
invoice - one-to-one relationship to Invoice<br>
Run Code Online (Sandbox Code Playgroud)
如果我想获得整个发票的itemAmount的平均值,我会使用以下(invoice是NSManagedObject):
float avgAmount = [[invoice valueForKeyPath:@"invoiceDetails.@avg.itemAmount"] floatValue];
Run Code Online (Sandbox Code Playgroud)
但是,我只想获取itemType = 1的对象的平均值.我可以遍历invoiceDetail项目并手动执行此操作,但我知道这会导致性能问题.我不确定这样做的最佳方法是什么.
谢谢你的帮助.