更新核心数据中的属性而不是更新实体

问题描述 投票:0回答:1

我将员工信息存储在我的应用程序的核心数据中。下次我连接到应用程序时,将检索核心数据中的数据并将其与新学生数据进行比较。我只想在任何一个属性更新时才更新该属性。而不是升级不必要的实体

extension Employee {

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

    @NSManaged public var name: String?
    @NSManaged public var state: String?
    @NSManaged public var department: String?
    @NSManaged public var experience: Int16
    @NSManaged public var workingShift: String?

}

extension Employee : Identifiable {

}

import Foundation

struct EmployeeModel: Identifiable, Hashable, Codable, CustomDebugStringConvertible{
    var debugDescription: String = "debug"
    var id: String
    var name: String
    var state: String
    var department: String
    var workingShift: String
    var experience:Int
    
    
}
extension EmployeeModel{
    static var MOCK_EMPLOYEE: [EmployeeModel] = [
        .init(id: "1", name: "John", state: "Kerala", department: "IOS", workingShift: "General", experience: 1),
        .init(id: "2",name: "Rohit", state: "Maharashtra", department: "Android", workingShift: "AfterNoon", experience: 2),
        .init(id: "3",name: "Aruna", state: "Bihari", department: "Web", workingShift: "Evening", experience: 3),
        .init(id: "4",name: "Abhijeet", state: "WestBengal", department: "Design", workingShift: "Night", experience: 4),
        .init(id: "5",name: "Basivi", state: "Telengana", department: "Game", workingShift: "General", experience: 5),
        .init(id: "6", name: "Andy", state: "Kerala", department: "IOS", workingShift: "General", experience: 1)
        ]
}


extension EmployeeModel{
    func equals (compareTo:EmployeeModel) -> Bool {
           return
               self.name == compareTo.name &&
               self.id == compareTo.id &&
               self.state == compareTo.state &&
        self.department == compareTo.department &&
        self.workingShift == compareTo.workingShift &&
        self.experience == compareTo.experience
       }


     func compareEmployee(lhs: EmployeeModel, rhs: EmployeeModel, completion: @escaping (EmployeeModel) -> Void) {
        var emp = EmployeeModel(id: "", name: "", state: "", department: "", workingShift: "", experience: 0)
        if lhs.id != rhs.id{
            emp.id = rhs.id
        }
        else{
            emp.id = lhs.id
        }
        if lhs.name != rhs.name{
            emp.name = rhs.name
        }
        else{
            emp.name = lhs.name
        }
        if lhs.state != rhs.state{
            emp.state = rhs.state
        }
        else{
            emp.state = lhs.state
        }
        if lhs.department != rhs.department{
            emp.department = rhs.department
        }
        else{
            emp.department = lhs.department
        }
        if lhs.workingShift != rhs.workingShift{
            emp.workingShift = rhs.department
        }
        else{
            emp.workingShift = lhs.workingShift
        }
        if lhs.experience != rhs.experience{
            emp.experience = rhs.experience
        }
        else{
            emp.experience = lhs.experience
        }
        completion(emp)
       }
}
   // MARK: - Core Data stack
    func checkDataStore() {
        let emp: Employee!
        let fetchUser: NSFetchRequest<Employee> = Employee.fetchRequest()
        //        fetchUser.predicate = NSPredicate(format: "name = %@", name as String)
        let moc = coredata.persistentContainer.viewContext
        
        
        let results = try? moc.fetch(fetchUser)
        
        
        do {
            if results!.count == 0{
                emp = Employee(context: moc)
                
                if let firstEmp = EmployeeModel.MOCK_EMPLOYEE[0] as? EmployeeModel{
                    emp.state = firstEmp.state
                    emp.name = firstEmp.name
                    emp.department = firstEmp.department
                    emp.workingShift = firstEmp.workingShift
                    emp.experience = Int16(firstEmp.experience)
                    
                }
            }
            else{
                let emp1 = EmployeeModel.MOCK_EMPLOYEE[0]
                let emp2 = EmployeeModel.MOCK_EMPLOYEE[4]
                
                emp1.compareEmployee(lhs: emp1, rhs: emp2) { resultModel in
                    if emp1 == resultModel{
                        print("No changes made")
                    } else {
                        print("Changes made. Updating server.")
                        results![0].state = resultModel.state
                        results![0].name = resultModel.name
                        results![0].department = resultModel.department
                        results![0].workingShift = resultModel.workingShift
                        results![0].experience = Int16(resultModel.experience)
                        
                    }
                }
            }
            
            
        coredata.saveContext()
        
    }
    catch {
        fatalError("Error in counting home record")
    }

}

这是我执行代码的正确方法还是有其他方法可以做到这一点?

我所希望的结果正在发生。但我很好奇是否还有另一种更直接的解决方案。我们可以这样做是因为结构很简单。如果响应很大且嵌套。当时我们能做什么?

swift database core-data protocols
1个回答
0
投票

您应该查看 NSManagedObject 属性

hasPersistentChangedValues

hasChanges

您的情况:

emp.hasPersistentChangedValues

emp.hasChanges

因此,如果您更改对象的 emp 属性。 CoreData 会将对象标记为已更改。该对象将具有标志 hasChanges true。即使您自己将财产分配给旧值。

但是标志 hasPersistentChangedValues 将显示您的对象是否与存储在磁盘上的对象发生了更改。即使你再次分配属性

另请检查答案

有持久更改值

© www.soinside.com 2019 - 2024. All rights reserved.