swift 核心数据NSManagedObject子类如何展开类的可选实体?

myss37ts  于 2023-01-04  发布在  Swift
关注(0)|答案(1)|浏览(112)

请允许我解释一下我的情况,因为我只是从核心数据开始。我将尝试总结,因为有太多的代码。
我想使用核心数据创建一个简单的程序,它具有:

  • 合同实体(具有编号、签订日期、合同标的、费用等属性)
  • 客户端实体(客户端名称、地址、idNumber)
  • 发票实体

合同实体和客户实体应该是一对一关系,一个合同对应一个客户。
我的意图是,无论何时创建合同,我都会同时创建一个客户端(在同一个视图中的同一个表单中)。基本上,我希望将“合同”实体传递给一个新视图,但从“合同”实体中提取“客户端”属性(名称、地址)
但是,在NSManagedObject子类中,Client是可选的类示例
我为每个实体创建了一个NSManagedObject子类。在我的Contract+CoreDataProperties swift文件中,我有一个@NSManaged公共变量,它是一个可选的客户端。

extension Contract {

@nonobjc public class func fetchRequest() -> NSFetchRequest<Contract> {
    return NSFetchRequest<Contract>(entityName: "Contract")
}

@NSManaged public var objectOfContract: String?
@NSManaged public var registrationNumber: String?
@NSManaged public var client: Client?
@NSManaged public var invoice: NSSet?

现在,在从存储中获取合同之后,我将合同传递给一个新视图。
我想以某种方式从contract. client中提取客户端属性。

如何操作?如何在NSManagedObject子类中展开“客户端”?

下面是代码的简短版本
视图1(部分):

@Environment(\.managedObjectContext) var moc
@FetchRequest(sortDescriptors: []) var contracts: FetchedResults<Contract>

ForEach (contracts, id: \.self) {contract in
                
    NavigationLink {
       DetailContract(contract: contract)
          } label: {
            Label (...)
          }

因此,在视图1中,我将合约传递给视图2
视图2(部分):

struct DetailContract: View {

@Environment(\.managedObjectContext) var moc
@State var contract: FetchedResults<Contract>.Element
@State var showClientDetailSheet: Bool = false

var body: some View {
    NavigationStack {
        List {
            Section {
                HStack {
                    Text("Client: \(contract.wrappedClientName)")
                    Spacer()
                    Button {
                        showClientDetailSheet.toggle()
                    } label: {
                        Image(systemName: "info.circle")
                    }
                }  
            }
        .navigationTitle("Details")
        .sheet(isPresented: $showClientDetailSheet) {
            DetailClient(client: contract.client)
        }
    }
}
}

详细客户端视图中的“客户端”为:

struct DetailClient: View {

@State var client: FetchedResults<Client>.Element

var body: some View {
    NavigationStack {
        List {
            Text(client.name ?? "")
            Text(client.address ?? "")
            Text(client.idNumber ?? "")
        }
    }
}
}

谢谢!希望您理解,我是新使用的核心数据,还在学习!

k3bvogb1

k3bvogb11#

我的客户是零,但我也想明白了。
不需要在子类文件中展开。
当我保存合约实体时,我没有调用“contract.client?.attribute”。
我没有这么做:

newContract.client = Client(context: managedObjectContext)
                    newContract.client?.name = clientName
                    newContract.client?.address = clientAddress
                    newContract.client?.idNumber = clientID
                    
                    try? managedObjectContext.save()
                    dismiss()

现在,我更改了DetailClient视图,将客户机的属性作为参数(字符串),并打开了String选项。

DetailClient(clientName: contract.client?.name ?? "Unknown", clientAddress: contract.client?.address ?? "Unknown", clientID: contract.client?.idNumber ?? "Unknown")

感谢您抽出宝贵时间!

相关问题