Core data CoreData父-子

Core data CoreData父-子,core-data,swiftui,Core Data,Swiftui,目标:我正在尝试创建一个大陆列表,当您单击该列表时,可以使用CoreData显示该大陆的国家列表 当前:每当我添加一个新国家时,它都会添加一个无标题的大陆对象&所有国家都会显示在所有大陆上 我目前有两个实体:大陆和国家,两者都只有一个属性:contraction.title和Country.name。大陆被设定为国家的母实体 尝试:在coreData模型编辑器中,我将大陆设置为国家的父实体&我将国家关系设置为大陆。两人都没有解决问题 代码: 大陆视图: struct ContentView: V

目标:我正在尝试创建一个大陆列表,当您单击该列表时,可以使用CoreData显示该大陆的国家列表

当前:每当我添加一个新国家时,它都会添加一个无标题的大陆对象&所有国家都会显示在所有大陆上

我目前有两个实体:大陆和国家,两者都只有一个属性:contraction.title和Country.name。大陆被设定为国家的母实体

尝试:在coreData模型编辑器中,我将大陆设置为国家的父实体&我将国家关系设置为大陆。两人都没有解决问题

代码: 大陆视图:

struct ContentView: View {
@Environment(\.managedObjectContext) private var viewContext

@FetchRequest(
    sortDescriptors: [NSSortDescriptor(keyPath: \Continent.title, ascending: true)],
    animation: .default)
private var items: FetchedResults<Continent>



var body: some View {
    NavigationView{
        List {
            ForEach(items) { item in
                NavigationLink(item.name ?? "Title", destination: Countries(title: item.name ?? "Title"))
            }

            //for adding new continents
            newContinent()
            
        }.navigationTitle("Continents")
        
    }
}
}
struct newContinent : View {
@Environment(\.managedObjectContext) private var viewContext

@State var place = ""

var body: some View {
    HStack{
        TextField("Add New Place", text: $place)
    
        Button(action: {
            let newItem = Continent(context: viewContext)
            newItem.title = place
            saveContext()
            
            place = ""
        }, label: {
            Text("Save")
                .foregroundColor(place == "" ? .gray : .white)
        }).disabled(place == "")
    }        
}


func saveContext() {
    do {
        try viewContext.save()
    } catch {
        let nsError = error as NSError
        fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
    }
}
struct Countries: View {
@Environment(\.managedObjectContext) private var viewContext

@FetchRequest(
    sortDescriptors: [NSSortDescriptor(keyPath: \Country.name, ascending: true)],
    animation: .default)
private var countries: FetchedResults<Country>

let title: String

var body: some View {
    NavigationView{
        List{
            ForEach(countries) { item in
                Text(item.name!)
            }
            newCountry()
        }
    }.navigationTitle(title)
    
}
}
struct newCountry : View {
@Environment(\.managedObjectContext) private var viewContext

@State var place = ""

var body: some View {
    HStack{
        TextField("Add New Country", text: $place)
    
        Button(action: {
            let newItem = Country(context: viewContext)
            newItem.name = place
            saveContext()
            
            place = ""
        }, label: {
            Text("Save")
                .foregroundColor(place == "" ? .gray : .primary)
        }).disabled(place == "")
    }  
}


func saveContext() {
    do {
        try viewContext.save()
    } catch {
        let nsError = error as NSError
        fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
    }
}
}
}

国家/地区视图:

struct ContentView: View {
@Environment(\.managedObjectContext) private var viewContext

@FetchRequest(
    sortDescriptors: [NSSortDescriptor(keyPath: \Continent.title, ascending: true)],
    animation: .default)
private var items: FetchedResults<Continent>



var body: some View {
    NavigationView{
        List {
            ForEach(items) { item in
                NavigationLink(item.name ?? "Title", destination: Countries(title: item.name ?? "Title"))
            }

            //for adding new continents
            newContinent()
            
        }.navigationTitle("Continents")
        
    }
}
}
struct newContinent : View {
@Environment(\.managedObjectContext) private var viewContext

@State var place = ""

var body: some View {
    HStack{
        TextField("Add New Place", text: $place)
    
        Button(action: {
            let newItem = Continent(context: viewContext)
            newItem.title = place
            saveContext()
            
            place = ""
        }, label: {
            Text("Save")
                .foregroundColor(place == "" ? .gray : .white)
        }).disabled(place == "")
    }        
}


func saveContext() {
    do {
        try viewContext.save()
    } catch {
        let nsError = error as NSError
        fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
    }
}
struct Countries: View {
@Environment(\.managedObjectContext) private var viewContext

@FetchRequest(
    sortDescriptors: [NSSortDescriptor(keyPath: \Country.name, ascending: true)],
    animation: .default)
private var countries: FetchedResults<Country>

let title: String

var body: some View {
    NavigationView{
        List{
            ForEach(countries) { item in
                Text(item.name!)
            }
            newCountry()
        }
    }.navigationTitle(title)
    
}
}
struct newCountry : View {
@Environment(\.managedObjectContext) private var viewContext

@State var place = ""

var body: some View {
    HStack{
        TextField("Add New Country", text: $place)
    
        Button(action: {
            let newItem = Country(context: viewContext)
            newItem.name = place
            saveContext()
            
            place = ""
        }, label: {
            Text("Save")
                .foregroundColor(place == "" ? .gray : .primary)
        }).disabled(place == "")
    }  
}


func saveContext() {
    do {
        try viewContext.save()
    } catch {
        let nsError = error as NSError
        fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
    }
}
}

如果你创建了一个新的国家对象,它应该被分配给一个现有的大陆,你不这么认为吗?因此,要么将一个已经选定的大陆发送到您的视图中创建国家,要么在该视图中有一个大陆列表可供选择。我注意到您在上面写了“父实体”,我希望您不是指“父实体”属性,因为这不是您在这里应该使用的,而只是关系。@JoakimDanielson-当我将已选择的大陆发送到“国家”视图时,是否将大陆设置为国家实体中的属性?是,该属性具有您指定的名称relationship@JoakimDanielson我将
大陆
作为属性传递给我的国家/地区视图,但没有
获取结果
,然后我将其设置为
国家/地区.大陆
,这就是关系。在我的国家视图中,我过滤了所有国家的
country.continent
&只显示满足该条件的国家。它现在似乎起作用了。谢谢你的帮助。