#swift #core-data #swiftui #nsmanagedobjectcontext
Вопрос:
Я работаю над проектом в SwiftUI, в основном используя основные данные. Моя основная база данных данных имеет несколько взаимосвязей: Конкретная проблема, с которой я сталкиваюсь, связана с моим «основным» классом: Биллом, у которого есть идентификатор. В Счете есть Лицо (Класс), которому он принадлежит, и, наконец, у этого Лица есть Адрес (улица, номер,…).
Мой подход до сих пор заключается в том, чтобы создать представление для этих классов, которое будет принимать данные с текстовыми полями. Итак, в BillingView я создал объект-счет и прочитал идентификатор из текстового поля. Затем я передал счет в PersonView, чтобы получить учетные данные. В PersonView я сохранил текст managedObjectContext и открыл другое представление: AddressView из BillingView. При попытке сохранить адрес я получаю сообщение об ошибке, в котором говорится, что мой человек равен нулю, хотя его следовало сохранить.
Я добавлю немного кода, чтобы уточнить:
Биллингвью:
public var billingID: Int64 = 0
struct BillingView: View {
@Environment(.managedObjectContext) var viewContext
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: Bill.id, ascending: true)],
animation: .default)
private var bills: FetchedResults<Bill>
@State private var addedBill: Bool = false
@State var bill: Bill
@State private var hasPerson = false
var body: some View {
VStack {
//Reading and Outputting Data
}
.padding()
.toolbar {
Button(action: addBill) {
Label("Add Item", systemImage: "plus")
}
}
}
private func addBill() {
withAnimation {
self.bill = Bill(context: viewContext)
self.bill.goesTo = Person(context: viewContext)
self.bill.goesTo!.has = Address(context: viewContext)
let lastID = self.bills.last?.id ?? 0
self.bill.id = Int64(lastID 1)
do {
try viewContext.save()
self.addedBill = true
} catch {
fatalError("Couldn't save Bill properly... (error)")
}
}
}
struct BillingView_Previews: PreviewProvider {
static var previews: some View {
BillingView(bill: Bill()).environment(.managedObjectContext, PersistenceController.preview.container.viewContext)
}
}
PersonView и AddressView выглядят одинаково, я добавлю соответствующие функции AddPerson/Address.
Представление о человеке:
private func addPerson() {
withAnimation {
self.bill.goesTo?.name = self.name
self.bill.goesTo?.surname = self.surname
self.bill.goesTo?.phone = self.phone
do {
try bill.goesTo?.managedObjectContext!.save()
try bill.managedObjectContext!.save()
self.submitted = true
} catch {
fatalError("Couln't save Person properly... (error)")
}
}
}
Адресвью:
private func addAddress() {
withAnimation {
self.bill.goesTo!.has?.street = self.street
self.bill.goesTo!.has?.number = self.number
self.bill.goesTo!.has?.postal = self.postalCode
do {
try bill.goesTo!.has!.managedObjectContext?.save()
try bill.goesTo!.managedObjectContext?.save()
try bill.managedObjectContext?.save()
} catch {
fatalError("Couldn't save address properly... (error)")
}
}
}
Я поиграл с различными способами сохранения объекта и до сих пор не совсем уверен, какой из них правильный.
Спасибо за чтение, хорошего дня!