首页 > 解决方案 > 通过关系忽略没有相关实体的实体,形成具有标题标题的核心数据实体列表

问题描述

我正在尝试在表单中显示核心数据信息。实体具有一对多的关系。出于演示目的,我制作了一个应用程序,其中包含制造商和两种类型的产品,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")
    }
}
}

我已经搜索过,但没有找到解决这个问题的方法。提前致谢。

标签: core-dataswiftui

解决方案


您需要过滤manufacturers以排除小部件(或链轮)计数为零的那些。像这样的东西:

ForEach(manufacturers.filter( { $0.wrappedManufacturerOfWidget.count > 0 }), id: \.self) { manufacturer in

对于链轮也是如此ForEach


推荐阅读