核心数据:自定义NSManagedObject和CRUD服务演示

这个故事基本上是了解我们如何在核心数据中执行基本的CRUD操作,即

  1. C :创建实体
  2. R :检索实体
  3. U :更新实体
  4. D :删除实体

让我们一步一步地做

创建一个新的Xcode项目,然后选择“ Use Core Data”,如下所示

之后,您将看到“ CoreDataDemo.xcdatamodelId ”,即“ ProjectName.xcdatamodelId ”。 点击它,然后选择下面的添加新实体按钮

您将获得一个空白实体,双击该实体将其重命名为“ Employee”。
现在添加属性/表字段
1.名称字符串
2. empId字符串
3.联系Integer 64
4.地址字符串
5. emailId字符串

Employee表看起来像

现在,在属性检查器中,您将看到带有下拉菜单的类选项,选择“ 手动/无”。
我们需要NSMangedObject Class的子类将值从类对象映射到数据库实体。
转到编辑器,然后选择创建 NSMangedObject子类。

之后,您将获得要选择的模型选项,选择CoreDataDemo ,然后选择需要子类的表,再选择Employee表。

您将看到2个名为
1. Employee + CoreDataClass.swift
2. Employee + CoreDataProperties.swift

Congratts !!! 您已成功创建表的子类。

创建一个名为EmployeClass的模型类,该模型类用于在视图控制器中显示员工数据。 像这样添加变量

类EmployeeClass:NSObject {

public var empId:字符串?
公共变量名称:字符串?
公共var联系人:Int64?
public var emailId:字符串?
公共变量地址:字符串?

覆盖init(){}
}

注意:使用两个类,以便业务逻辑和数据库逻辑应该独立

现在创建一个新的File,它是NSObject的子类,并将其命名为CoreDataService。
转到AppDelegate类,然后将所有核心数据代码移至CoreDataService类。
创建静态初始化器以使此类单例

静态让shared = CoreDataService ()

现在添加一个新文件Name DBManager并添加静态初始化器。

静态让共享= DBManager ()

在此类中,将执行与数据库有关的所有操作。 开始吧

public func addEmployee(employee:EmployeeClass){

让dbManager = CoreDataService.shared
让上下文= dbManager.dbContext
让entityDesc = NSEntityDescription.entity(forEntityName:“雇员”,在:上下文中)
守护让实体=实体描述其他{返回}
让employeeObj = Employee(实体:实体,insertInto:上下文)

employeeObj.empId = employee.empId
employeeObj.name =员工名
employeeObj.address =员工地址
employeeObj.contact =员工联系人!
employeeObj.emailId = employee.emailId

做{
尝试context.save()
}将let错误捕获为NSError {
打印(“无法不保存雇员\(错误),\(错误.userInfo)”)
}
}

在此函数中,您将看到参数是EmployeeClass类型的对象,即,将包装视图控制器字段中的值并按如下所示传递此函数

让emp = EmployeeClass()
emp.empId =“ 101”
emp.name =名称。文本
emp.emailId = email.text
emp.contact = Int64(contact.text)
emp.address = address.text

DBManager.shared.addEmployee(员工:emp)

公共职能getEmployeeFromDB(empId:String)->员工? {

让dbManager = CoreDataService.shared
让上下文= dbManager.dbContext
让实体= NSEntityDescription.entity(forEntityName:“雇员”,在:上下文中)

让fetchRequest = NSFetchRequest ()
fetchRequest.entity =实体
让谓词= NSPredicate(格式:“ empId ==%@”,empId)
fetchRequest.predicate =谓词

做{
让结果=尝试context.fetch(fetchRequest)
警卫让员工=(结果为?[员工])?.首先否则{return nil}
返回员工
}将let错误捕获为NSError {
打印(“无法提取员工\(错误),\(error.userInfo)”)
}

返回零
}

公共职能getEmployee(empId:String)-> EmployeeClass? {

警卫让employeeObj = self.getEmployeeFromDB(empId:empId)else {return nil}

让员工= EmployeeClass()

employee.empId = employeeObj.empId
employee.name = employeeObj.name
employee.address = employeeObj.address
employee.contact = employeeObj.contact
employee.emailId = employeeObj.emailId

返回员工
}

在这里,您将传递员工ID以获取包装在EmployeeClass对象中的所有员工详细信息。 您会发现这里有2种方法

1. getEmployeeFromDB :将以自定义NSMangedObject对象的形式提供数据。

2. getEmployee :将来自( NSMangedObject)数据库对象的值映射到模型类EmployeeClass。

public func updateEmployee(雇员:EmployeeClass)-> Bool {

守卫let empId = employee.empId,let employeeObj = self.getEmployeeFromDB(empId:empId)else {返回false}
employeeObj.name =员工名
employeeObj.address =员工地址
employeeObj.contact =员工联系人!
employeeObj.emailId = employee.emailId

让dbManager = CoreDataService.shared
让上下文= dbManager.dbContext

做{
尝试context.save()
返回真
}将let错误捕获为NSError {
打印(“无法更新雇员\(错误),\(error.userInfo)”)
}

返回假
}

您想要更新哪个雇员数据将这些值包装在EmployeeClass对象中。 确保不更新empId,即您需要使用需要更新其员工详细信息的相同empId。

让emp = EmployeeClass()
emp.empId =“ 101”
emp.name =名称。文本
emp.emailId = email.text
emp.contact = Int64(contact.text)
emp.address = address.text

DBManager.shared.updateEmployee(员工:emp)

它将返回Bool以确保值是否被更新

公共函数deleteEmployee(empId:String){

让dbManager = CoreDataService.shared
让上下文= dbManager.dbContext
让实体= NSEntityDescription.entity(forEntityName:“雇员”,在:上下文中)

让fetchRequest = NSFetchRequest ()
fetchRequest.entity =实体
让谓词= NSPredicate(格式:“ empId ==%@”,empId)
fetchRequest.predicate =谓词

做{
让结果=尝试context.fetch(fetchRequest)
后卫let obj =(result as?[Employee])?. first else {return}
context.delete(obj)
尝试context.save()
}将let错误捕获为NSError {
打印(“无法删除员工\(错误),\(error.userInfo)”)
}

传递您需要从本地数据中删除的empId。

DBManager.shared.deleteEmployee(empId:“ 101”)

因此,这些是核心数据中的基本操作。 该博客将为您提供有关核心数据工作流程的基本思想。

您可以从这里下载项目
有关基本和更多信息,请访问Apple Link