#swift #core-data #swiftui #relationship #inventory-management
#swift #core-данные #swiftui #взаимосвязь #управление запасами
Вопрос:
Я создаю приложение для управления запасами / пациентами для своего магазина, и хотя мне удалось успешно создать его часть, посвященную пациентам, часть инвентаризации все еще ускользает от меня. Мне нужно создавать поставщиков и привязывать к ним бренды, но я хочу иметь возможность создавать их с помощью своего приложения, а не постоянно кодировать новых поставщиков и новые бренды. Мне удалось это сделать, но с одним сбоем: каждый раз, когда я создаю бренд для поставщика, этот же бренд попадает во все другие созданные поставщики. (часть атрибутов именования на французском языке) Вот код для списка поставщиков:
import SwiftUI
struct FrameCompany: View {
@Environment(.managedObjectContext) var moc
@FetchRequest(entity: FournisseursMontures.entity(), sortDescriptors: [NSSortDescriptor(keyPath: FournisseursMontures.fournisseurs, ascending: true)])
var Fournisseurs: FetchedResults<FournisseursMontures>
@State private var showingAddScreen = false
@State private var showingEditScreen = false
var body: some View {
List {
ForEach(Fournisseurs, id: .self) { Fournisseur in
NavigationLink(destination: Brand(Fournisseurs: Fournisseur)) {
VStack {
HStack {
Text(Fournisseur.fournisseurs ?? "")
}
}
}
}
.onDelete(perform: deleteFournisseur)
}
.navigationBarTitle("Fournisseurs Montures")
.navigationBarItems(leading: EditButton(), trailing:
Button(action: {
self.showingAddScreen.toggle()
}) {
Image(systemName: "plus")
}
)
.sheet(isPresented: $showingAddScreen) {
AddNewCompany().environment(.managedObjectContext, self.moc)
}
}
func deleteFournisseur(at offsets: IndexSet) {
for offset in offsets{
let Fournisseur = Fournisseurs[offset]
moc.delete(Fournisseur)
}
try? moc.save()
}
}
struct FrameCompany_Previews: PreviewProvider {
static var previews: some View {
FrameCompany()
}
}
Вот код для добавления компании:
import SwiftUI
struct AddNewCompany: View {
@Environment(.managedObjectContext) var moc
@Environment(.presentationMode) var presentationMode
@State private var fournisseurs = ""
var body: some View {
Form {
Section {
TextField("Fournisseur", text: $fournisseurs)
}
Section{
Button("Enregistrer") {
let newCompany = FournisseursMontures(context: self.moc)
newCompany.fournisseurs = self.fournisseurs
try? self.moc.save()
self.presentationMode.wrappedValue.dismiss()
}
}
}
}
}
struct AddNewCompany_Previews: PreviewProvider {
static var previews: some View {
AddNewCompany()
}
}
вот код для списка брендов:
//
// Brand.swift
// PIBAv1
//
// Created by Hicham on 2020-11-19.
// Copyright © 2020 Hicham. All rights reserved.
//
import SwiftUI
struct Brand: View {
@Environment(.managedObjectContext) var moc
@FetchRequest(entity: Collections.entity(), sortDescriptors: [
NSSortDescriptor(keyPath: Collections.marques, ascending: true)])
var Brands: FetchedResults<Collections>
@State private var showingAddScreen = false
@State private var showingEditScreen = false
@ObservedObject var Fournisseurs: FournisseursMontures
var body: some View {
List {
ForEach(Brands, id: .self) {Brand in
NavigationLink(destination: Model(Brands: Brand)) {
VStack {
HStack {
Text(Brand.marques ?? "")
}
}
}
}
.onDelete(perform: deleteBrand)
}
.navigationBarTitle("Marques")
.navigationBarItems(leading: EditButton(), trailing:
Button(action: {
self.showingAddScreen.toggle()
}) {
Image(systemName: "plus")
}
)
.sheet(isPresented: $showingAddScreen) {
AddNewBrand().environment(.managedObjectContext, self.moc)
}
}
func deleteBrand(at offsets: IndexSet) {
for offset in offsets{
let Brand = Brands[offset]
moc.delete(Brand)
}
try? moc.save()
}
struct Brand_Previews: PreviewProvider {
static var previews: some View {
Brand(Fournisseurs: FournisseursMontures())
}
}
}
и, наконец, код для добавления нового бренда:
import SwiftUI
struct AddNewBrand: View {
@Environment(.managedObjectContext) var moc
@Environment(.presentationMode) var presentationMode
@State private var marques = ""
var body: some View {
Form {
Section {
TextField("Marques", text: $marques)
}
Section{
Button("Enregistrer") {
let newBrand = Collections(context: self.moc)
newBrand.marques = self.marques
try? self.moc.save()
self.presentationMode.wrappedValue.dismiss()
}
}
}
}
}
struct AddNewBrand_Previews: PreviewProvider {
static var previews: some View {
AddNewBrand()
}
}
Спасибо за помощь!
Ответ №1:
Это больше похоже на проблему с базой данных, чем на проблему с кодом. Ваши отношения с таблицами, вероятно, были бы более полезными.
Насколько я понимаю, бренд присваивается нескольким поставщикам, но у поставщика должно быть несколько (эксклюзивных) брендов.
Отношения между брендом и поставщиком должны быть один к одному, но это один ко многим.
Комментарии:
1. Я пытался сделать именно это, но это все равно не удается. Должна ли быть связь только от бренда к поставщику или от бренда к поставщику, а также от поставщика к бренду?
2. У бренда должен быть NSSet поставщиков, а у поставщика должен быть один бренд. Когда вы показываете поставщиков брендов, вы показываете им только их NSSet, а не все, что есть в базе данных.