我将员工信息存储在我的应用程序的核心数据中。下次我连接到应用程序时,将检索核心数据中的数据并将其与新学生数据进行比较。我只想在任何一个属性更新时才更新该属性。而不是升级不必要的实体
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")
}
}
这是我执行代码的正确方法还是有其他方法可以做到这一点?
我所希望的结果正在发生。但我很好奇是否还有另一种更直接的解决方案。我们可以这样做是因为结构很简单。如果响应很大且嵌套。当时我们能做什么?
您应该查看 NSManagedObject 属性
hasPersistentChangedValues
或
hasChanges
您的情况:
emp.hasPersistentChangedValues
或
emp.hasChanges
因此,如果您更改对象的 emp 属性。 CoreData 会将对象标记为已更改。该对象将具有标志 hasChanges true。即使您自己将财产分配给旧值。
但是标志 hasPersistentChangedValues 将显示您的对象是否与存储在磁盘上的对象发生了更改。即使你再次分配属性
另请检查答案