在 NSPredicate 中组合“AND”和“OR”条件

2024-01-29

再次回来需要更多帮助来构建我的 NSPredicates :(

Category
{
   name:string
   subs<-->>SubCategory
}

SubCategory
{
   name:string
   numbervalue:NSNumber
}

我想知道如何创建谓词AND and OR.

例如,我想返回名称==“category_name”的每个类别,该类别还有一个数值为“valueA”的子类别OR“价值B”。

我已经尝试了所有可能的谓词构造函数组合,但我就是无法让它工作。

这是我迄今为止最好的尝试。

NSPredicate *predicate=[NSPredicate predicateWithFormat@"(name== %@) AND (ANY subs.numbervalue==%@ OR ANY subs.numbervalue==%@)", @"aname", value1, value2];

Edit 1

第二次尝试。对“numbervalue”的过滤仍然不起作用。

NSNumber valueA=[NSNumber numberWithInt:20];
NSNumber valueA=[NSNumber numberWithInt:90];
NSArray *arr=[NSArray arrayWithObject:valueA,valueB,nil];

predicate=[NSPredicate predicateWithFormat:@"(name==%@)AND(ANY subs.numbervalue IN %@)",@"aname",arr];

Edit 2

我尝试过仅按 numberValue 进行过滤,但完全忽略了名称。

1) 使用此方法会导致返回整个集合,即使集合中只有 1 项具有该值。

predicate=[NSPredicate predicateWithFormat:@"(ANY subs.numbervalue IN %@)",arr];

2) 使用此方法会导致相同的问题,即使只有 1 个项目匹配,也会返回集合中的每个项目。

predicate=[NSPredicate predicateWithFormat:@"((SUBQUERY(subs, $x, $x.numbervalue == %@ or $x.numbervalue == %@).@count > 0)", value1, value2];

使用最简单的版本也会导致同样的问题......我之前没有注意到这一点。

NSPredicate *predicate=[NSPredicate predicateWithFormat@"(ANY subs.numbervalue==%@ ,valueA];

所以我想我的问题已经缩小了。

类别是一个实体。 子类别是一个实体。

Category 与 SubCategory 是一对多的关系,表示为 SubCategory 的 NSSet。

每个子类别都有一个名为 numbervalue 的属性。

Edit 3

为了测试我有 2 个类别。 两个类别都有 10 个子项,每个子项的数值均为 1 -10;

使用此代码将返回两个类别以及每个类别的所有 10 个子类别。

预期结果是返回两个类别,每个类别只有 2 个子类别。

我已经查出了我的所有对象并且数据是正确的。问题是我无法返回已过滤子项的类别。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSManagedObjectContext *context=[[DataSource sharedDataSource]managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Category" inManagedObjectContext:context];
[fetchRequest setEntity:entity];

[fetchRequest setFetchBatchSize:20];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];

NSPredicate *predicate;
NSNumber *a=[NSNumber numberWithFloat:1];
NSNumber *b=[NSNumber numberWithFloat:2];
predicate=[NSPredicate predicateWithFormat:@"(SUBQUERY(subs,$x,$x.numbervalue==%@ or $x.numbervalue==%@).@count> 0)",a,b];

[fetchRequest setPredicate:predicate];
[fetchRequest setSortDescriptors:sortDescriptors];

NSError *error = nil;
[NSFetchedResultsContoller deleteCacheWithName:nil];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"name" cacheName:@"Master"];
aFetchedResultsController.delegate = self;

self.fetchedResultsController = aFetchedResultsController;

if (![self.fetchedResultsController performFetch:&error]) {

   NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
   abort();
}

除了@Stuart的答案之外,您还可以使用 NSCompoundPredicate 进行 OR & AND 操作,如下所示。

目标-C - 或

// OR Condition //

NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"X == 1"];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"X == 2"];
NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[predicate1, predicate2]];

对象-C - AND

NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"X == 1"];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"X == 2"];
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[predicate1, predicate2]];

斯威夫特 - 或

let predicate1:NSPredicate = NSPredicate(format: "X == 1")
let predicate2:NSPredicate = NSPredicate(format: "Y == 2")
let predicate:NSPredicate  = NSCompoundPredicate(orPredicateWithSubpredicates: [predicate1,predicate2] )

斯威夫特 - 与

let predicate1:NSPredicate = NSPredicate(format: "X == 1")
let predicate2:NSPredicate = NSPredicate(format: "Y == 2")
let predicate:NSPredicate  = NSCompoundPredicate(andPredicateWithSubpredicates: [predicate1,predicate2] )

Swift 3 - 或

    let predicate1 = NSPredicate(format: "X == 1")
    let predicate2 = NSPredicate(format: "Y == 2")
    let predicateCompound = NSCompoundPredicate.init(type: .or, subpredicates: [predicate1,predicate2])

Swift 3 - 与

    let predicate1 = NSPredicate(format: "X == 1")
    let predicate2 = NSPredicate(format: "Y == 2")
    let predicateCompound = NSCompoundPredicate.init(type: .and, subpredicates: [predicate1,predicate2])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 NSPredicate 中组合“AND”和“OR”条件 的相关文章

  • 为什么在尝试编译此代码时会收到错误“错误:未知类型名称'虚拟'”?

    Code struct IRenderingEngine virtual void Initialize int width int height 0 virtual void Render const 0 virtual void Upd
  • 如何以编程方式设置设备(UI)方向?

    希望屏幕 UI 上的所有内容都能够从横向左向右旋转 反之亦然 我该怎么做呢 这是私人的吗 我知道 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOrientation inte
  • Swift 3:如何访问48字节CFData中matrix_float3x3的值?

    我正在尝试访问内在矩阵answer https stackoverflow com a 48159895 9296667 通过运行下面的命令 我能够得到一个 48 字节的任意对象 https developer apple com docu
  • NSCFData isRessized 崩溃?

    我目前在控制台中收到此崩溃日志 2011 08 23 19 18 40 064 App 1697 707 NSCFData isResizable unrecognized selector sent to instance 0x11f1c
  • 如何在 Swift 中使用indexesOfObjectsPassingTest:

    IndexOfObjectsPassingTest 的声明在 Swift 中看起来像这样 func indexesOfObjectsPassingTest predicate AnyObject Int CMutablePointer
  • UIStackView分布均匀填充

    所以 我有一个UIStackView其中包含四 4 UIViews 如果我删除其中一 1 个UIViews 其他三 3 个将填满UIStackView 我的问题 如何添加最大高度UIView这样它就不会填满整个空间UIStackView即使
  • 无法从 iOS 中的框架访问 .nib(XIB) 文件

    我已经从现有的代码库中创建了一个框架 并尝试在新的代码库中使用它 这很好用 但是当我尝试访问属于我的框架包的一部分的 nib 文件时 我的应用程序崩溃了 这是我用来访问视图控制器 XIB 文件的代码 testViewController c
  • iOS Safari Mobile 禁用上一个和下一个选择输入

    上周五我发现了关于此问题的类似问题 但似乎无法再次找到它 如果有人能指出我正确的方向 那就太好了 本质上我在一个页面上有多个选择菜单 第一个在加载时填充 第二个在第一个选择时填充 够简单的 但是 在 iOS 设备中 当您点击选择元素时 它会
  • 如何在 Swift 中将文件名与文件扩展名分开?

    给定包中文件的名称 我想将该文件加载到我的 Swift 应用程序中 所以我需要使用这个方法 let soundURL NSBundle mainBundle URLForResource fname withExtension ext 无论
  • iOS - 如何在 swift 中使用 `NSMutableString`

    我已经看过这段 Objective C 代码 但我很难在 swift 中做同样的事情 NSMutableAttributedString res self richTextEditor attributedText mutableCopy
  • 如何开始复杂级别的跨平台移动应用开发? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 从一个模态视图无缝翻转到另一个模态视图,而不显示纯色背景

    我的 iPad 应用程序的 UI 如下 当我点击Settings按钮 我希望对话框水平翻转以显示设置对话框 我这个工作正常 但是 当对话翻转时会显示背景颜色 如你看到的 有什么办法可以让对话框翻转时不显示该颜色块吗 我希望它看起来更加无缝
  • CALayer边框奇怪问题

    我正在向 CALayer 添加边框 但有一些奇怪的行为 在我应用的边框之后出现模糊边框 参见屏幕截图 这是我的代码 void configureLabel self hidden YES self textAlignment NSTextA
  • 使用未解析的标识符“FlurryAdInterstitial”

    我正在尝试整合Flurry Interstitial Ads使用cocoapods in Swift and Xcode 7 1 1 我正在关注开发人员雅虎网站上的此文档 https developer yahoo com flurry d
  • AVAssetExportSession 无法导出从 iCloud 下载的视频

    我正在尝试创建从用户相册中选择的视频的缩小版本 输出的最大尺寸为 720p 因此 在检索视频时 我使用 mediumQualityFormat as the deliveryMode 如果用户设备中不存在原始视频或其中等质量版本 这会导致
  • UIViewControllerAnimatedTransitioning:旋转更改后黑屏片段

    我已经创建了一个视图控制器转换 只要我不更改设备方向 一切都正常 图 1 显示了应有的屏幕 然后我切换到下一个视图控制器 在其中更改方向 现在我回到第一个视图控制器并再次切换方向 然后我得到的结果如图 2 所示 出现黑色边框 请不要介意屏幕
  • watchOS 错误:控制器接口描述中的未知属性

    我将 WKInterfacePicker 添加到情节提要中 并将其连接到界面控制器中的 IBOutlet 运行应用程序时 它在控制台中显示一条错误消息 控制器的接口描述 watchPicker 中的未知属性 Code interface I
  • 如何解决 Xcode 5 中的红色(已移动)文件?

    在 Xcode 4 中 当您要移动文件时 可以通过单击右侧菜单中的按钮并通过 Finder 选择新位置来解析文件的新位置 在 Xcode 5 中 右侧菜单中没有按钮 我还没有找到任何方法通过右键单击文件或顶部菜单栏选项来指定文件的新位置 在
  • 如何在 UICollectionView 中将行居中?

    我有一个UICollectionView与随机细胞 有什么方法可以让我将行居中吗 默认情况下它是这样的 x x x x x x x x x x x x x x 这是所需的布局 x x x x x x x x x x x x 我必须做这样的事
  • 更改 iOS7 中 UIAlertView 的字体大小

    我想更改alertView中消息文本和标题文本的字体大小 苹果网站上没有任何文档谈到这一点 但苹果在其子类注释中表示 UIAlertView 类旨在按原样使用 请参考以下链接 https developer apple com librar

随机推荐

  • VB.net、调用、委托和线程。无法弄清楚如何跨类使用它们

    长话短说 我在尝试弄清楚如何在使用线程时使用调用和 或委托从单独的类更新用户表单时遇到了困难 我很确定这对于有更多经验的人来说是愚蠢而明显的 我知道可能需要委托 但我所有的努力似乎只有在从主线程调用它时才有效 我在网上查了半天 还是没有明白
  • DSL 的嵌入式脚本引擎

    我正在开发一个需要嵌入式 DSL 来满足其预期要求的项目 DSL 将基于用户定义的事件 这是所需语法的模型 user defined event 1 event body user defined event 2 event body 可能
  • 稍微旋转文本——我应该使用 css 还是 javascript?

    我正在尝试旋转一段文本 如下所示 这可以用 css 来完成还是需要使用 javascript 您可以使用 CSS3 以跨浏览器的方式做到这一点transform https developer mozilla org en CSS moz
  • 如何将 HDMI 1.4a 兼容的立体信号从 OpenGL 应用程序输出到 3DTV?

    我有一个 OpenGL 应用程序 可以通过 HDMI 将立体 3D 视频输出到现成的电视 但它目前要求显示器支持 1 4a 之前的手动选择正确格式的方法 并排 上下ETC 但是 现在我需要支持一个仅支持 HDMI 1 4a 3D 信号的设备
  • 在 Spark 结构化流中创建 Dataframe forEachWriter 以插入 kudu 表问题

    我有一个问题 我尝试寻找解决方案 但无法找到任何解决方案 并且希望获得任何 指针 所以我试图将 Spark 结构化流与 Apache Kudu 集成 我正在从 Kafka 读取流并进行一些处理 现在应该写入 Kudu 表 问题是 Spark
  • 将字符向量中的日期替换为特定格式

    我得到以下字符向量 On the evening of 2017 04 23 I was too tired to complete my homework that was due on 24 04 2017 我需要搜索它以查找所有出现的
  • 使用 Terraform 或 Helm 在 EKS 集群上的 ISTIO 上进行设置

    我是 Terraform 和 Helm 世界的新手 我需要在 AWS EKS 集群上设置 Istio 我能够使用 Terraform 设置 EKS 集群 我正在考虑通过编写 terraform 模块使用 Terraform 在 EKS 集群
  • 具有默认值的实例变量的 Morphia 投影行为

    我不确定 Morphia 是否是这样设计的 但它是这样的 Student class 方法略 Entity value students noClassnameStored true public class Student Id priv
  • Google 登录 - GoogleIdTokenVerifier 延迟验证令牌

    我已经实现了从 Android 或 iOS 设备接收 Google 登录令牌并尝试验证它的后端 代码几个月前工作正常 没有改变 但最近开始拒绝所有无效令牌 当我在发布时间约 10 秒后尝试使用之前失败的令牌再次重复验证时 它开始工作并返回用
  • C#/.NET 相当于 Java 的 Matcher.matches() 和 Matcher.lookingAt()

    我正在寻找一种方法来确定单个正则表达式是否与整个字符串 字符串的开头或 C 中的一部分匹配 在Java中 你可以构造一个Matcher对象 并使用方法matches 检查它是否与整个输入匹配 lookingAt 查看它是否与输入的开头匹配
  • 在选项卡布局上实现分页

    我知道如何使用 xml 布局开发选项卡活动 而且我知道如何在 android 中进行分页 如 android market 应用程序中所示 但我不知道如何将此分页概念与选项卡活动合并以及如何从 java 代码创建选项卡活动 请参阅下面的代码
  • 如何在 Yii-2 应用程序中添加验证码?

    我正在尝试将验证码添加到登录表单中 我的环境 Yii 2 PHP 5 4 45 版本 IIS 10 0 Windows 10 In login php LoginForm php and SiteController php我添加了以下内容
  • Android Textview 文本在底部被截断

    所以我有 2 个文本视图 一个在另一个之上 但是当填充第二个文本视图时 剪切会在底部被切断 标题为 header subtitle 的文本视图存在相关问题 显然我错过了一些明显的东西 但不知道是什么 Issue https i stack
  • 显示大于设备屏幕的图像

    我想在不调整图像大小的情况下显示比设备屏幕更大的图像 它必须位于屏幕中央 我怎样才能做到这一点 将滚动视图与图像视图一起使用并设置该滚动视图的高度 Example
  • 用于执行“Between”的 Linq 表达式

    在 SQL 中 您可以编写一个查询 在 nvachar 类型的列上执行 Between 并简单地返回指定的最小值和最大值之间的所有行 例如 Table Id Int Name nvarchar Contents 1 Annie 2 Bill
  • Matplotlib 为重叠的艺术家选择事件顺序

    我在 matplotlib pick 事件中遇到了一个非常奇怪的问题 我有两位艺术家 他们都是可选择的并且一开始就不重叠 洞 和 钉子 当我选择其中之一时 在事件处理过程中我move另一个到我刚刚点击的位置 将 钉子 移动到 洞 中 然后
  • Range.Find 在 VBA Excel 中不区分一月和十一月(二月和十二月)

    假设我有以下琐碎的任务 连续写出 2016 年 1 月到 2018 年 6 月的第一个日期 找到 01 Janu 2016 并将其涂成红色 Use Range Find 因此 我创建了一个代码 从 1 循环到 30 并写入每个月的第一个日期
  • PyQt5:使用不透明小部件创建透明窗口

    是否可以使 mainWindow 完全透明 而其他小部件仍然可见 For example 我想让应用程序透明并使其他所有内容可见 例如 mainFrame 关闭按钮 最小化按钮 正如 Felipe提到的 你可以使用 window setAt
  • 在python中提取分隔符[]之间的单词

    从下面的字符串中 我想提取分隔符之间的单词 like Service Current Service 9991 1 22 str mysrv events Generating Event Name Service Current Cate
  • 在 NSPredicate 中组合“AND”和“OR”条件

    再次回来需要更多帮助来构建我的 NSPredicates Category name string subs lt gt gt SubCategory SubCategory name string numbervalue NSNumber