Ios 以一对多关系保存数据

Ios 以一对多关系保存数据,ios,swift,core-data,swift3,Ios,Swift,Core Data,Swift3,我的核心数据模型如下所示 下面的功能将考勤数据保存为员工的一部分(应在凭证表中提供) 数据保存成功,但当我使用Sim放大镜工具查看记录时,一条空记录与实际记录一起保存在凭证表中 当我再次运行它时,凭证表中会保存另外一条空记录,以及父项为空的考勤表中保存的记录 我无法找出这个问题的原因。我的工作环境是Xcode 8.3.1、iOS 10.3.1和swift 3 附加代码: func getCurrentEmpRecord(ofTheEmployee id: String) -> Crede

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

下面的功能将考勤数据保存为员工的一部分(应在凭证表中提供)

数据保存成功,但当我使用Sim放大镜工具查看记录时,一条空记录与实际记录一起保存在凭证表中

当我再次运行它时,凭证表中会保存另外一条空记录,以及父项为空的考勤表中保存的记录

我无法找出这个问题的原因。我的工作环境是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
}
}
func getCurrentEmpRecord(员工id的字符串)->凭证{
让emp=凭证(上下文:dbContext)
let fetchRequest:NSFetchRequest=Credentials.fetchRequest()
fetchRequest.predicate=NSPredicate.init(格式:“empId==%@”,id)
做{
让searchResults=try dbContext.fetch(fetchRequest)
如果searchResults.count>0{
在搜索结果中记录{
返回记录
}
返回电磁脉冲
}否则{
返回电磁脉冲
}
}抓住{
打印(“错误:\(错误)”)
返回电磁脉冲
}
}

每次调用
getCurrentEmpRecord()
时,您都在创建一个空的
凭证
,如果存在具有给定
id的
凭证
,则会在CoreData中获得一个额外的空条目

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
}
仅当它不存在时才创建它:

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
}

尝试用
emp.addToAttendenceReport(NSSet(array:attendanceSummarySet))替换
emp.addToAttendenceReport(NSSet(array:attendanceSummarySet))
它引发错误,因为类型“Credentials”的值没有成员“addToaddToAttendenceReport”。我正在使用实体的CodeGen属性作为类定义。为什么
addToaddToAttendenceReport
(2 x addTo)?很抱歉,这是我键入错误的单个add。emp.addToAttendenceReport(NSSet(数组:attendanceSummarySet))我使用的与此完全相同,然后Xcode抛出我以下类型的错误值“Credentials”没有成员“addToAttendenceReport”。Xcode抛出我一个错误作为缺少的返回类型,因为catch块不返回任何内容,这就是在我以前的代码中创建空凭据的原因。抱歉,现在无法测试。更新的答案,希望工作的版本。如果您不想在数据库中保留
凭据,则不能在数据库中创建该凭据。非常感谢您,尽管您救了我一天。
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
}