CoreData/数据存储管理, CoreDataRelationships/关系型数据结构存储管理 的使用

news/2024/7/20 0:42:01 标签: iOS, Swift, UI

1. CoreData 数据的增删改查操作

  1.1 创建数据实体管理文件

    点击菜单栏 File -> New -> File... -> Core Data 栏下,选择 Data Mode,创建 FruitsContainer.xcdatamodeld 文件

  1.2 创建 FruitEntity 实体表

    打开 FruitsContainer.xcdatamodeld 文件,点击 Add Entity,创建 FruitEntity 实体表,添加 name 属性

  1.3 添加信息如下图:

  1.4 实现

Swift">import CoreData

// View  - UI
// Model - data point
// ViewModel - manages the data for a view

class CoreDataViewModel: ObservableObject{
    // 添加数据容器
    let container: NSPersistentContainer
    // 实体数组
    @Published var savedEntities:[FruitEntity] = []
    
    init() {
        self.container = NSPersistentContainer(name: "FruitsContainer")
        // 加载持久
        self.container.loadPersistentStores { description, error in
            if let error = error{
                print("Error loading core data. \(error)")
            }
        }
        // 获取实体数据
        fetchFruits()
    }
    
    // 获取数据
    func fetchFruits(){
        // 获取实体
        let request = NSFetchRequest<FruitEntity>(entityName: "FruitEntity")
        do {
            savedEntities = try container.viewContext.fetch(request)
        }catch let error{
            print("Error retching. \(error)")
        }
    }
    
    // 添加数据
    func addFruit(text: String){
        let newFruit = FruitEntity(context: container.viewContext)
        newFruit.name = text
        saveData()
    }
    
    // 删除数据
    func deleteFruit(indexSet: IndexSet){
        guard let index = indexSet.first else{ return }
        let fruitEntity = savedEntities[index]
        container.viewContext.delete(fruitEntity)
        saveData()
    }
    
    // 更新数据
    func updateFruit(entity: FruitEntity){
        //let currentName = entity.name ?? ""
        //let newName = currentName + "!"
        //entity.name = newName
        entity.name = (entity.name ?? "").appending("!")
        saveData()
    }

    // 保存数据
    func saveData(){
        do{
            try container.viewContext.save()
            fetchFruits()
        }catch let error{
            print("Error saving. \(error)")
        }
    }
}

/// 核心数据的使用,新建项目 CoreDataBootcamp 实现修改 Demo 示例
struct CoreDataBootcamp: View {
    @StateObject var vm  = CoreDataViewModel()
    @State var textFileText = ""
    
    var body: some View {
        NavigationView {
            VStack(spacing: 20) {
                TextField("Add fruit here...", text: $textFileText)
                    .font(.headline)
                    .padding(.horizontal)
                    .frame(height: 55)
                    .background(Color.secondary.opacity(0.3))
                    .cornerRadius(10)
                    .padding(.horizontal)
                Button {
                    // 判断是否为空
                    guard !textFileText.isEmpty else { return }
                    vm.addFruit(text: textFileText)
                    textFileText = ""
                } label: {
                    Text("Submit")
                        .font(.headline)
                        .foregroundColor(.white)
                        .frame(height: 55)
                        .frame(maxWidth: .infinity)
                        .background(Color.pink)
                        .cornerRadius(10)
                        .padding(.horizontal)
                }
                List {
                    ForEach(vm.savedEntities) { entity in
                        Text(entity.name ?? "NO Name")
                            .onTapGesture {
                                vm.updateFruit(entity: entity)
                            }
                    }
                    .onDelete(perform: vm.deleteFruit)
                }
                .listStyle(.plain)
            }
            .navigationTitle("Fruits")
        }
    }
}

  1.5 效果图:

2. CoreDataRelationships 关系型数据表结构的操作

  2.1 创建管理数据表文件 CoreDataContainer.xcdatamodeld,实体类,属性及对应关系

  2.2 实体关系表如图:

            

  2.3 实现

Swift">import CoreData

// 3 enitites
// BusinessEntity 企业
// DepartmentEntity 部门
// EmployeeEntity 员工

/// 核心数据操作管理
class CoreDataManager{
    // Sinstance 单例模式
    static let instance = CoreDataManager()
    
    let container: NSPersistentContainer
    let context: NSManagedObjectContext
    

    init() {
        container = NSPersistentContainer(name: "CoreDataContainer")
        // 加载数据
        container.loadPersistentStores { description, error in
            if let error = error{
                print("Error loading core data: \(error)")
            }
        }
        context = container.viewContext
    }
    
    // 保存
    func save(){
        do{
            try context.save()
            print("Saved successfully!")
        }catch let error{
            print("Error saving core data: \(error.localizedDescription)")
        }
    }
    
}

/// ViewModel
class CoreDataRelationshipViewModel: ObservableObject{
    let manager = CoreDataManager.instance
    /// 所有的企业
    @Published var businesses:[BusinessEntity] = []
    /// 所有的部门
    @Published var departments:[DepartmentEntity] = []
    /// 所有的员工
    @Published var employees:[EmployeeEntity] = []
    
    init() {
        getBusinesses()
        getDepartments()
        getEmployees()
    }
    
    /// 获取企业实体
    func getBusinesses(){
        let request = NSFetchRequest<BusinessEntity>(entityName: "BusinessEntity")
        // 排序
        let sort = NSSortDescriptor(keyPath: \BusinessEntity.name, ascending:  true)
        request.sortDescriptors = [sort]
        
        // 过滤
        //let filter = NSPredicate(format: "name == %@", "Apple")
        //request.predicate = filter
        
        do{
            businesses =  try manager.context.fetch(request)
        }catch let error{
            print("Error fatching. \(error.localizedDescription)")
        }
    }
    
    /// 获取部门实体
    func getDepartments(){
        let request = NSFetchRequest<DepartmentEntity>(entityName: "DepartmentEntity")
        do{
            departments =  try manager.context.fetch(request)
        }catch let error{
            print("Error fatching. \(error.localizedDescription)")
        }
    }
    
    /// 获取所有的员工信息 EmployeeEntity
    func getEmployees(){
        let request = NSFetchRequest<EmployeeEntity>(entityName: "EmployeeEntity")
        do{
            employees = try manager.context.fetch(request)
        }catch let error{
            print("Error fatching. \(error.localizedDescription)")
        }
    }
    
    //获取指定企业的员工
    func getEmployees(forBusiness business: BusinessEntity){
        let request = NSFetchRequest<EmployeeEntity>(entityName: "EmployeeEntity")
        //过滤器
        let filter = NSPredicate(format: "business == %@", business)
        request.predicate = filter
        
        do{
            employees = try manager.context.fetch(request)
        }catch let error{
            print("Error fatching. \(error.localizedDescription)")
        }
    }
    
    /// 更新企业里信息
    func updateBusiness(){
        let existingBusiness = businesses[1]
        existingBusiness.addToDepartments(departments[0])
        // existingBusiness.removeFromDepartments(departments[0])
        // existingBusiness.addToEmployees(employees[0])
        save()
    }
    
    /// 添加企业实体
    func addBusiness(){
        let newBusiness = BusinessEntity(context: manager.context)
        // Apple Microsoft Facebook
        newBusiness.name = "Apple"
        
        // add existing departments to the new business
        // 添加现有的部门实体到新的企业实体内
        // newBusiness.departments = [departments[0], departments[1]]
        
        // add existing employees to the new business
        // 添加现有的员工实体到现的企业实体内
        // newBusiness.employees = [employees[1]]
        
        // add new business to existing department
        // 添加新的企业实体到部门实体内
        // newBusiness.addToDepartments()
        
        // add new business to existing employee
        // 添加新的企业实体到现有的员工实体内
        // newBusiness.addToEmployees()
        save()
    }
    
    /// 添加部门实体
    func addDepartment(){
        let newDepartment = DepartmentEntity(context: manager.context)
        //Marketing Engineering Finance
        newDepartment.name = "Marketing"
        // 对应第一个企业
        newDepartment.businesses = [businesses[0],businesses[1],businesses[2]]
        //newDepartment.addToEmployees(employees[0])
        //newDepartment.employees = [employees[1]]
        //newDepartment.addToEmployees(employees[1])
        save()
    }
   
    /// 添加员工
    func addEmployee(){
        let newEmployee = EmployeeEntity(context: manager.context)
        // Emily John
        newEmployee.name = "John"
        newEmployee.age = 21
        newEmployee.dateJoined = Date()
        
        // 对应企业
        newEmployee.business = businesses[2]
        // 对应部门
        newEmployee.department = departments[1]
        save()
    }
    
    /// 删除部门实体
    func deleteDepartment() {
        let index = 1
        guard departments.count > index else { return }
        let department = departments[index]
        manager.context.delete(department)
        save()
    }
    
    /// 保存
    func save(){
        // 移除数组内容
        businesses.removeAll()
        departments.removeAll()
        employees.removeAll()
        
        // 保存获取数据
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            self.manager.save()
            self.getBusinesses()
            self.getDepartments()
            self.getEmployees()
        }
    }
}

// 核心数据关系型结构
struct CoreDataRelationshipsBootcamp: View {
    // ViewModel
    @StateObject var viewModel = CoreDataRelationshipViewModel()
    
    var body: some View {
        NavigationView {
            ScrollView {
                VStack(spacing: 20) {
                    Button {
                        //viewModel.addBusiness()
                        //viewModel.addDepartment()
                        //viewModel.addEmployee()
                        //viewModel.updateBusiness()
                        viewModel.deleteDepartment()
                    } label: {
                        Text("Perform Action")
                            .foregroundColor(.white)
                            .frame(height: 55)
                            .frame(maxWidth:.infinity )
                            .background(Color.accentColor.cornerRadius(10))
                    }
                    // 企业
                    ScrollView(.horizontal, showsIndicators: true) {
                        HStack(alignment: .top) {
                            ForEach(viewModel.businesses) { business in
                                BusinessView(entity: business)
                            }
                        }
                    }
                    // 部门
                    ScrollView(.horizontal, showsIndicators: true) {
                        HStack(alignment: .top) {
                            ForEach(viewModel.departments) { department in
                                DepartmentView(entity: department)
                            }
                        }
                    }
                    // 员工
                    ScrollView(.horizontal, showsIndicators: true) {
                        HStack(alignment: .top) {
                            ForEach(viewModel.employees) { employee in
                                EmployeeView(entity: employee)
                            }
                        }
                    }
                }
                .padding()
            }
            .navigationTitle("Relationships")
        }
    }
}

// 企业视图
struct BusinessView: View{
    let entity: BusinessEntity
    
    var body: some View {
        VStack(alignment: .leading, spacing: 20) {
            Text("Name: \(entity.name ?? "")")
                .bold()
            // 获取企业下的部门
            if let departments = entity.departments?.allObjects as? [DepartmentEntity]{
                Text("Departments:")
                    .bold()
                // 获取所有部门
                ForEach(departments) { department in
                    Text(department.name ?? "")
                }
            }
            
            // 获取企业下的员工
            if let employees = entity.employees?.allObjects as? [EmployeeEntity]{
                Text("Employees:")
                    .bold()
                // 获取所有的员工
                ForEach(employees) { employee in
                    Text(employee.name ?? "")
                }
            }
        }
        .padding()
        .frame(maxWidth: 300,alignment: .leading)
        .background(Color.gray.opacity(0.5))
        .cornerRadius(10)
        .shadow(radius: 10)
    }
}

// 部门视图
struct DepartmentView: View{
    let entity: DepartmentEntity
    
    var body: some View {
        VStack(alignment: .leading, spacing: 20) {
            Text("Name: \(entity.name ?? "")")
                .bold()
            // 获取部门的企业
            if let businesses = entity.businesses?.allObjects as? [BusinessEntity]{
                Text("Businesses:")
                    .bold()
                // 获取所有企业
                ForEach(businesses) { business in
                    Text(business.name ?? "")
                }
            }
            
            // 获取部门下的员工
            if let employees = entity.employees?.allObjects as? [EmployeeEntity]{
                Text("Employees:")
                    .bold()
                // 获取所有的员工
                ForEach(employees) { employee in
                    Text(employee.name ?? "")
                }
            }
        }
        .padding()
        .frame(maxWidth: 300,alignment: .leading)
        .background(Color.green.opacity(0.5))
        .cornerRadius(10)
        .shadow(radius: 10)
    }
}

// 员工视图
struct EmployeeView: View{
    let entity: EmployeeEntity
    
    var body: some View {
        VStack(alignment: .leading, spacing: 20) {
            Text("Name: \(entity.name ?? "")")
                .bold()
            Text("Age: \(entity.age)")
            Text("Date jiined: \(entity.dateJoined ?? Date())")
            
            // 获取企业
            Text("Businesses:")
                .bold()
            Text(entity.business?.name ?? "")
            
            // 获取部门
            Text("Departmentes:")
                .bold()
            Text(entity.department?.name ?? "")
        }
        .padding()
        .frame(maxWidth: 300,alignment: .leading)
        .background(Color.blue.opacity(0.5))
        .cornerRadius(10)
        .shadow(radius: 10)
    }
}

  2.4 效果图:


http://www.niftyadmin.cn/n/5055259.html

相关文章

MR混合现实在军事课堂教学中的应用演示

战场模拟&#xff1a;利用MR技术可以创建逼真的战场模拟环境&#xff0c;将学生置身于真实的战场场景中&#xff0c;可以体验和学习各种作战技巧和战术策略。学生可以通过佩戴MR头盔或眼镜&#xff0c;观察虚拟的场景&#xff0c;并与虚拟对象进行互动&#xff0c;如操作武器、…

【MATLAB源码-第39期】基于m序列/gold序列的直接扩频通信仿真,编码方式采用卷积码,调制方式采用BPSK。

1、算法描述 直接序列扩频通信系统的仿真一般包括以下几个主要步骤&#xff1a;信号产生、扩频、卷积编码、BPSK调制、信道传输、BPSK解调、卷积码译码和解扩。 信号产生&#xff1a; 首先&#xff0c;产生一个二进制数据序列作为待发送的信息位。 扩频&#xff1a; 采用m序列…

Spring Framework 学习笔记2:注解开发

Spring Framework 学习笔记2&#xff1a;注解开发 本文使用的示例项目是 spring-demo。 1.Component Component注解的用途与<bean/>标签的用途是相同的&#xff0c;都用于向 IoC 容器添加一个 Bean 定义。 比如&#xff1a; Component public class UserDaoImpl imp…

基于微信小程序的高校暑期社会实践小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

循环神经网络(Recurrent Neural Networks,RNN)模型深度学习

循环神经网络&#xff08;Recurrent Neural Networks&#xff0c;RNN&#xff09;是深度学习领域中一种重要的模型&#xff0c;尤其在处理序列数据方面具有显著的优势。本文将介绍循环神经网络的基本概念、工作原理、应用场景以及与其他神经网络的区别&#xff0c;并通过具体案…

Mybatis3详解 之 全局配置文件详解

1、全局配置文件 前面我们看到的Mybatis全局文件并没有全部列举出来&#xff0c;所以这一章我们来详细的介绍一遍&#xff0c;Mybatis的全局配置文件并不是很复杂&#xff0c;它的所有元素和代码如下所示&#xff1a; <?xml version"1.0" encoding"UTF-8&…

谈谈 Redis 过期删除策略

谈谈 Redis 过期删除策略 如何判断 key 是否过期&#xff1f; 每当我们对一个 key 设置了过期时间时&#xff0c;Redis 会把该 key 带上过期时间存储到一个过期字典&#xff08;expires dict&#xff09;中&#xff0c;也就是说「过期字典」保存了数据库中所有 key 的过期时间…

27、Flink 的SQL之SELECT (Pattern Recognition 模式检测)介绍及详细示例(7)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…