以一对多关系保存数据

Posted

技术标签:

【中文标题】以一对多关系保存数据【英文标题】:Saving data in a One To Many Relationship 【发布时间】:2017-04-25 07:02:27 【问题描述】:

我的核心数据模型如下所示。

以下函数将考勤数据保存为员工的一部分(应在凭据表中提供)。

func addOrUpdateAttendanceReport(data: [AttendanceSummaryInfoDTO])

    let doesEmpExist = validateEmpCredentials(ofThe: EmpCredentialsDTO(empMailId: currentActiveEmpId, empPassword: ""))

    if doesEmpExist
        let emp = getCurrentEmpRecord(ofTheEmployee: currentActiveEmpId)

        var attendanceSummarySet = [Attendance]()
        for info in data
        
            let attendanceInfo = Attendance(context: dbContext)
            attendanceInfo.status = info.leaveType
            attendanceInfo.reptDate = info.reptDate

            attendanceSummarySet.append(attendanceInfo)
        
        emp.attendanceReport = NSSet(array: attendanceSummarySet)

        do
            try dbContext.save()

         catch 
            print("Error: \(error)")  // something bad happened, handle this situation appropriately

        

    
    else
        print("Unable to save attendance summary info because, there is no employee exist with current id in local database ")
    

数据保存成功,但是当我使用 simMagnifier 工具查看记录时,Credentials 表中会保存一条空记录以及实际记录。

当我再次运行它时,凭据表中将再保存一条空记录,同时将父项为空的记录保存在出勤表中。

我无法找出导致此问题的路线原因。我的工作环境是 Xcode 8.3.1,ios 10.3.1 和 swift 3。

附加代码:

func getCurrentEmpRecord(ofTheEmployee id: String) -> Credentials 

let emp = Credentials(context: dbContext)
let fetchRequest: NSFetchRequest<Credentials> = Credentials.fetchRequest()

fetchRequest.predicate = NSPredicate.init(format: "empId == %@", id)

do 
    let searchResults = try dbContext.fetch(fetchRequest)
    if searchResults.count > 0 
        for record in searchResults 
            return record
        
        return emp
     else 
        return emp
    
 catch 
    print("Error: \(error)")
    return emp


【问题讨论】:

尝试用emp.addToAttendenceReport(NSSet(array: attendanceSummarySet))替换emp.attendanceReport = NSSet(array: attendanceSummarySet) 它抛出错误,'Credentials' 类型的值没有成员'addToaddToAttendenceReport'。我使用实体的 CodeGen 属性作为类定义。 为什么是addToaddToAttendenceReport (2 x addTo)? 对不起,这是一个单一的 addTo 这是我的打字错误。 emp.addToAttendenceReport(NSSet(array: admissionSummarySet)) 我完全像这样使用然后 Xcode 向我抛出以下错误 'Credentials' 类型的值没有成员'addToAttendenceReport'. 【参考方案1】:

每次调用getCurrentEmpRecord() 时都会创建一个空的Credentials,因此如果存在具有给定idCredentials,则在CoreData 中获得一个额外的空条目。

仅当它不存在时才创建它:

func getCurrentEmpRecord(ofTheEmployee id: String) -> Credentials 
    //let emp = Credentials(context: dbContext) // do not create emp here ...
    let fetchRequest: NSFetchRequest<Credentials> = Credentials.fetchRequest()
    fetchRequest.predicate = NSPredicate.init(format: "empId == %@", id)

    do 
        let searchResults = try dbContext.fetch(fetchRequest)
        if searchResults.count > 0 
            return searchResults.first!
        
     catch 
        print("Error: \(error)")
    

    let emp = Credentials(context: dbContext) // ... but only if you need to create it
    return emp


更新:

我如何理解方法的名称(“getCurrentEmpRecord”),您根本不想创建一个空的Credential,即使不存在具有给定idemp

func getCurrentEmpRecord(ofTheEmployee id: String) -> Credentials? 
    let fetchRequest: NSFetchRequest<Credentials> = Credentials.fetchRequest()
    fetchRequest.predicate = NSPredicate.init(format: "empId == %@", id)

    do 
        let searchResults = try dbContext.fetch(fetchRequest)
        if searchResults.count > 0 
            return searchResults.first!
        
     catch 
        print("Error: \(error)")
    

    return nil

【讨论】:

Xcode 由于缺少返回类型而向我抛出错误,因为 catch 块不返回任何内容,这就是在我之前的代码中创建空凭据的原因。 暂时无法测试,抱歉。用希望工作的版本更新了答案。如果您不想将 Credentials 持久化到数据库中,则不得在数据库中创建它。 非常感谢你,我以为你拯救了我的一天。

以上是关于以一对多关系保存数据的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:一对多关系 - 没有保存细节

核心数据一对多关系未正确/按预期保存

如何使用 Objective-C 将一对多关系数据保存到核心数据中

Laravel 5.8 在数据透视表上保存一对多关系

如何使用 laravel 8 同时保存一对多关系数据

一对多关系如何在spring boot中保存数据