Core data 通过忽略没有相关实体的实体的关系,形成具有标题标题的核心数据实体列表
我试图以一种形式显示核心数据信息。这些实体具有一对多关系。为了演示的目的,我制作了一个应用程序,它有制造商和两种产品,链轮和小部件。制造商是唯一的,链轮和小部件对许多人来说是唯一的。制造商是唯一的,因此不能复制 我可以获取数据,显示在节标题中列出制造商名称的位置,下面是产品。我遇到的问题是,虽然每个制造商要么生产链轮,要么生产小部件,或者两者都生产,但它们并不都生产。所以,当我列出这些数据时,我最后得到的是没有任何产品的制造商的部分标题。您可以在以下屏幕截图中看到Cogswell不制作小部件,而Gotrockets不制作链轮: 我不希望在widgets列表中显示Cogswell,而在sprockets列表中不显示Gotrockets,我不知道如何构造、过滤或使用谓词来实现这一点。我还试图再次返回正确的信息,但当我试图不返回没有产品的制造商的视图时,编译器会犹豫,这是可以理解的。我目前的代码是:Core data 通过忽略没有相关实体的实体的关系,形成具有标题标题的核心数据实体列表,core-data,swiftui,Core Data,Swiftui,我试图以一种形式显示核心数据信息。这些实体具有一对多关系。为了演示的目的,我制作了一个应用程序,它有制造商和两种产品,链轮和小部件。制造商是唯一的,链轮和小部件对许多人来说是唯一的。制造商是唯一的,因此不能复制 我可以获取数据,显示在节标题中列出制造商名称的位置,下面是产品。我遇到的问题是,虽然每个制造商要么生产链轮,要么生产小部件,或者两者都生产,但它们并不都生产。所以,当我列出这些数据时,我最后得到的是没有任何产品的制造商的部分标题。您可以在以下屏幕截图中看到Cogswell不制作小部件,而
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")
}
}
}
struct ContentView:View{
@环境(\.managedObjectContext)变量managedObjectContext
@FetchRequest(实体:Manufacturer.entity(),sortDescriptors:[])变量manufacturers:FetchedResults
私有变量numberFormatter:numberFormatter{
let formatter=NumberFormatter()
formatter.numberStyle=.decimal
返回格式化程序
}
专用var度量格式:度量格式{
let formatter=MeasurementFormatter()
formatter.unitStyle=.short
返回格式化程序
}
var body:一些观点{
导航视图{
形式{
文本(“小部件:”)
ForEach(制造商,id:\.self){中的制造商
节(标题:文本(manufacturer.wrappedName)){
ForEach(manufacturer.wrappedManufacturerOfWidget,id:\.self){widget中的widget
文本(“\(widget.wrappedTitle)”)
}
}
}
文本(“链轮:”)
ForEach(制造商,id:\.self){中的制造商
节(标题:文本(manufacturer.wrappedName)){
ForEach(manufacturer.wrappedManufacturerOfSprocket,id:\.self){sprocket in
文本(“\(sprocket.wrappedTitle)”)
}
}
}
按钮(“添加数据”){
设spacely=Manufacturer(上下文:self.managedObjectContext)
spacely.name=“spacely”
让cogswell=制造商(上下文:self.managedObjectContext)
cogswell.name=“cogswell”
设gotrockets=Manufacturer(上下文:self.managedObjectContext)
gotrockets.name=“gotrockets”
让ColosalSprocket=Sprocket(上下文:self.managedObjectContext)
ColosalSprocket.id=UUID()
巨像链轮.sprocketMadeBy=spacely
巨人链轮。title=“巨人链轮”
让cogSprocket=Sprocket(上下文:self.managedObjectContext)
cogsporlet.id=UUID()
cogSprocket.sprocketMadeBy=cogswell
cogsporlet.title=“cogsporlet”
让whizzoWidget=Widget(上下文:self.managedObjectContext)
whizzoWidget.id=UUID()
whizzoWidget.widgetMadeBy=gotrockets
whizzoWidget.title=“Whizzo小部件”
让uniblabWidget=Widget(上下文:self.managedObjectContext)
uniblabWidget.id=UUID()
uniblabWidget.widgetMadeBy=spacely
uniblabWidget.title=“Uniblab”
try?self.managedObjectContext.save()
}
}
.navigationBarTitle(“产品”)
}
}
}
我已经搜索过了,但还没有找到解决这个问题的办法。提前感谢。您需要筛选
制造商
,以排除小部件(或链轮)计数为零的制造商。大概是这样的:
ForEach(manufacturers.filter( { $0.wrappedManufacturerOfWidget.count > 0 }), id: \.self) { manufacturer in
同样,在链轮的
ForEach
中。我没有想到过滤。依靠ForEach。现在我觉得自己很愚蠢。谢谢你给我指明了正确的方向。它很有魅力,很简单。