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
相关产品推荐
相关产品推荐

