Создание поставщика и добавление к ним брендов в SwiftUI с помощью CoreData

#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, а не все, что есть в базе данных.