You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift CoreData:如何用NSPredicate查询关联Child B的Parent

解决方案

在CoreData中查询关联Child B类型子实体的Parent列表,有两种可靠的NSPredicate写法:

方法1:通过实体名称匹配

利用CoreData实体自带的entity.name属性,直接判断关联的child实体名称是否为Child B:

// Swift 代码示例
let fetchRequest: NSFetchRequest<Parent> = Parent.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "child.entity.name == %@", "Child B")

do {
    let targetParents = try yourManagedContext.fetch(fetchRequest)
    // 处理查询到的Parent列表
} catch {
    print("查询出错:\(error.localizedDescription)")
}
// Objective-C 代码示例
NSFetchRequest *fetchRequest = [Parent fetchRequest];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"child.entity.name == %@", @"Child B"];

NSError *error = nil;
NSArray *targetParents = [yourManagedContext executeFetchRequest:fetchRequest error:&error];
if (error) {
    NSLog(@"查询出错:%@", error.localizedDescription);
}

方法2:直接判断实体类型

通过is操作符直接匹配子实体的类类型,这种写法更类型安全,无需硬编码实体名称:

// Swift 代码示例
let fetchRequest: NSFetchRequest<Parent> = Parent.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "child is %@", ChildB.self)

do {
    let targetParents = try yourManagedContext.fetch(fetchRequest)
    // 处理查询到的Parent列表
} catch {
    print("查询出错:\(error.localizedDescription)")
}
// Objective-C 代码示例
NSFetchRequest *fetchRequest = [Parent fetchRequest];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"child isKindOfClass:%@", [ChildB class]];

NSError *error = nil;
NSArray *targetParents = [yourManagedContext executeFetchRequest:fetchRequest error:&error];
if (error) {
    NSLog(@"查询出错:%@", error.localizedDescription);
}

注意事项

  • 两种方法均适用于CoreData的单表继承(Single Table Inheritance)和分层表继承(Hierarchical Store)模式,因为CoreData会自动维护实体类型的标识信息。
  • 你之前尝试的child is type Child B不是NSPredicate的合法语法,所以无法生效,替换为上面的写法即可解决问题。

内容的提问来源于stack exchange,提问作者tcvnc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 07:03:23