core-data - 通过关系忽略没有相关实体的实体,形成具有标题标题的核心数据实体列表
问题描述
我正在尝试在表单中显示核心数据信息。实体具有一对多的关系。出于演示目的,我制作了一个应用程序,其中包含制造商和两种类型的产品,Sprockets 和 Widgets。制造商是唯一的,链轮和小部件是多头的。制造商是独一无二的,因此它们不能被复制。
我可以获取数据以显示制造商名称在部分标题中列出的位置,产品位于下方。我遇到的问题是,虽然每个制造商都生产 Sprocket、Widget 或两者兼而有之,但它们并非都生产。因此,当我列出数据时,我最终会得到下面没有任何产品的制造商的部分标题。您可以在以下屏幕截图中看到 Cogswell 不制造小部件,而 Gotrockets 不制造链轮:
我不想在小部件列表中显示 Cogswell,在 sprockets 列表中不显示 Gotrocket,我不知道如何构造、过滤或使用谓词来执行此操作。我也试图让另一个只返回正确的信息,但是当我试图不返回没有产品的制造商的视图时,编译器会犹豫,这是可以理解的。我目前的代码是这样的:
struct ContentView: View {
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(entity: Manufacturer.entity(), sortDescriptors: []) var manufacturers: FetchedResults<Manufacturer>
private var numberFormatter: NumberFormatter {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
return formatter
}
private var measurementFormatter: MeasurementFormatter {
let formatter = MeasurementFormatter ()
formatter.unitStyle = .short
return formatter
}
var body: some View {
NavigationView {
Form {
Text("Widgets:")
ForEach(manufacturers, id: \.self) { manufacturer in
Section(header: Text(manufacturer.wrappedName)) {
ForEach(manufacturer.wrappedManufacturerOfWidget, id: \.self) { widget in
Text("\(widget.wrappedTitle)")
}
}
}
Text("Sprockets:")
ForEach(manufacturers, id: \.self) { manufacturer in
Section(header: Text(manufacturer.wrappedName)) {
ForEach(manufacturer.wrappedManufacturerOfSprocket, id: \.self) { sprocket in
Text("\(sprocket.wrappedTitle)")
}
}
}
Button("Add Data") {
let spacely = Manufacturer(context: self.managedObjectContext)
spacely.name = "Spacely"
let cogswell = Manufacturer(context: self.managedObjectContext)
cogswell.name = "Cogswell"
let gotrockets = Manufacturer(context: self.managedObjectContext)
gotrockets.name = "Gotrockets"
let colossalSprocket = Sprocket(context: self.managedObjectContext)
colossalSprocket.id = UUID()
colossalSprocket.sprocketMadeBy = spacely
colossalSprocket.title = "Colossal Sprocket"
let cogSprocket = Sprocket(context: self.managedObjectContext)
cogSprocket.id = UUID()
cogSprocket.sprocketMadeBy = cogswell
cogSprocket.title = "CogSprocket"
let whizzoWidget = Widget(context: self.managedObjectContext)
whizzoWidget.id = UUID()
whizzoWidget.widgetMadeBy = gotrockets
whizzoWidget.title = "Whizzo Widget"
let uniblabWidget = Widget(context: self.managedObjectContext)
uniblabWidget.id = UUID()
uniblabWidget.widgetMadeBy = spacely
uniblabWidget.title = "Uniblab"
try? self.managedObjectContext.save()
}
}
.navigationBarTitle("Products")
}
}
}
我已经搜索过,但没有找到解决这个问题的方法。提前致谢。
解决方案
您需要过滤manufacturers
以排除小部件(或链轮)计数为零的那些。像这样的东西:
ForEach(manufacturers.filter( { $0.wrappedManufacturerOfWidget.count > 0 }), id: \.self) { manufacturer in
对于链轮也是如此ForEach
。
推荐阅读
- python - 如何在 Django 中的表单中添加 GenericRelation 字段
- python - 在不合并 alpha 的情况下将 Surface 粘贴到另一个 Surface
- html - 使用列数时不显示元素
- java - 尝试学习“一个字母关闭”加密技术
- mysql - CURRENT_TIMESTAMP() 以不同的时区保存
- r - 在观察事件中使用带有数据框的下载按钮
- javascript - 我如何在 google chrome 浏览器中打印这个 java 脚本代码
- parsing - Lex 无法识别双重运算符 - !=、:=、<< 等。我可以给 Lex 表达式优先级吗?
- angular - AppComponent中的ERROR不能作为入口组件
- soapui - SOAP UI - 使用响应并将其保存为属性,然后将其用作下一个请求的参数