IOS - 如何在 Core Data Swift 中将数据插入到具有关系的不同表中

Posted

技术标签:

【中文标题】IOS - 如何在 Core Data Swift 中将数据插入到具有关系的不同表中【英文标题】:IOS - How to Insert data into different tables with relationship In Core Data Swift 【发布时间】:2018-02-04 13:02:15 【问题描述】:

我们有两个具有一对一关系的表。 personel.idpersonel 映射到 personeltochart.idpersonel

    人员 个人图表

在登录事件中,我们从网络服务同步personel 表的数据,并将其保存到personel 表中。我们必须获取另一个事件的其他表数据并保存。

问题是当我们尝试从这两个表中获取数据时,为什么我们正确获取了personel 表的数据,但personeltochart 表的数据为零?

人员

名字 个人身份

personelToChart

身份证号 个人身份

这里是一个保存表数据的例子:

                    let jsonEmza = try jsonDecoder.decode([JSONNameTabel].self, from: data)

                    var privateContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
                    privateContext = CoreDataManager.shared.persistentContainer.viewContext


                    jsonEmza.forEach( (jsonCompany) in
                        let tabel = jsonCompany.tableName
                        if tabel == "Personel"

                        jsonCompany.personel?.forEach( (field) in
                                let personel = Personel(context: privateContext)
                                personel.firstname = field.firstName
                                personel.idpersonel = field.id

                            )
 do 

                            try privateContext.save()

                         catch let saveErr 
                            print("Failed to save personel:", saveErr)
                        

                        

获取示例

    let context = CoreDataManager.shared.persistentContainer.viewContext

    let fetchRequest = NSFetchRequest<Personel>(entityName: "Personel")
   let predicate = NSPredicate(format: "idpersonel == %@", "147")
   fetchRequest.predicate = predicate
    do 
        let listNameh = try context.fetch(fetchRequest)
        listNameh.forEach( (item) in
            print(item.idpersonel ?? "")
            print(item.lastname ?? "")
            print(item.firstname ?? "")
            print(item.personelToChart?.id)

        )


     catch let fetchErr 
        print("Failed to fetch Personel:", fetchErr)

    

item.personelToChart?.id 的数据为nil

为什么会这样?

【问题讨论】:

您尚未在第一个代码示例中创建的Personel 和(可能)Chart 表之间设置任何关系。仅仅宣布关系是不够的。您必须将对象分配给Personel 上的personelToChart 属性。 【参考方案1】:

就像 Sam 所说,您需要在 Personel 上为 PersonelToChart 分配一个对象。例如,这是我的核心数据模型

Leg (flightId, flightName, Aircraft) 飞机(aircraftId,aircraftName) 确保您在 Flight 实体中的关系类似于

let Aircraft = AircraftCoreData(context: self.persistentContainer.viewContext)
        secondAircraft.aircraftId = 02334
        secondAircraft.aircraftName = "ABC"

        leg.aircraft = Aircraft

您将看到我们创建了飞机对象,为其属性分配了值,然后将该对象分配给了 leg.aircraft 属性。现在当你获取数据时,你不会得到 nil

【讨论】:

以上是关于IOS - 如何在 Core Data Swift 中将数据插入到具有关系的不同表中的主要内容,如果未能解决你的问题,请参考以下文章

IOS Swift Core Data如何在propertiesToFetch中添加不在propertiesToGroupBy中的字段

Swift - 如何检查现有的 Core Data Store iOS

如何在 SWIFT 的 IOS CORE-DATA 请求中使用 SQL GROUP BY 和 SUM 函数?

如何正确设置 Core Data Stack 到 iOS 和 Swift 中的第一个视图控制器?

Swift之深入解析如何结合Core Data和SwiftUI

Swift 3 Core Data - 如何同步保存上下文?