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