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

news2024/12/25 16:48:50

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 实现

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 实现

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.coloradmin.cn/o/1049134.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Quartus医院病房呼叫系统病床呼叫Verilog,源代码下载

名称&#xff1a;医院病房呼叫系统病床呼叫 软件&#xff1a;Quartus 语言&#xff1a;Verilog 要求&#xff1a; 1、用1~6个开关模拟6个病房的呼叫输入信号,1号优先级最高;1~6优先级依次降低; 2、 用一个数码管显示呼叫信号的号码;没信号呼叫时显示0;有多个信号呼叫时,显…

2023年鄂州中级职称申报时间是什么时候呢?

鄂州在6.7月份组织了一次水平能力测试&#xff0c;鄂州中级职称申报时间终于出来了&#xff0c;关于鄂州中级职称申报的一些情况&#xff0c;甘建二告诉你&#xff1a; 一、鄂州中级职称申报时间&#xff1a; 1.网上申报审核时间。个人申报2023年09月27日至2023年10月10日&…

单链表操作 C实现

struct LNode { //定义一个节点 int data; //数据域 struct LNode *next; //指针域 }; 0.初始化 typedef sturct LNode{ //定义单链表结点类型 int date ; //每个结点存放一个数据元素struct LNode *next; //指针指向下…

leetCode 62.不同路径 动态规划 + 空间复杂度优化

62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xf…

运行软件mfc100u.dll缺失是怎么办?mfc100u.dll丢失解决方法分享

Mfc100u.dll 丢失的问题可能困扰着许多使用计算机的用户。Mfc100u.dll 是一个重要的动态链接库文件&#xff0c;它包含了许多功能模块&#xff0c;如字符串处理、数学计算、文件操作等。当 Mfc100u.dll 文件丢失或损坏时&#xff0c;可能会导致许多应用程序无法正常运行&#x…

【深度学习实验】卷积神经网络(六):卷积神经网络模型(VGG)训练、评价

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 构建数据集&#xff08;CIFAR10Dataset&#xff09; a. read_csv_labels&#xff08;&#xff09; b. CIFAR10Dataset 2. 构建模型&#xff08;FeedForward&…

Chrome(谷歌浏览器)如何关闭搜索栏历史记录

目录 问题描述解决方法插件解决&#xff08;亲测有效&#xff09;自带设置解决步骤首先打开 地址 输入&#xff1a;chrome://flags关闭浏览器&#xff0c;重新打开Chrome 发现 已经正常 问题描述 Chrome是大家熟知的浏览器&#xff0c;但是搜索栏的历史记录如何自己一条条的删…

学校宿舍一键视频对讲

学校宿舍一键视频对讲 大学宿舍一键视频对讲是指在大学宿舍内安装一套视频对讲系统&#xff0c;通过一键操作&#xff0c;实现与宿舍内其他人进行视频通话的功能。 该系统通常包括以下组成部分&#xff1a; 1. 室内终端&#xff1a;每个宿舍内安装一个室内终端&#xff0c;室…

JavaScript求数组的交集和差集

1. 求交集(从2个数组中找到相同的元素, 组成新数组, 注意去重): 1) Setfilterincludes // 求交集: const arr1 [0, 1, 2] const arr2 [3, 2, 0] function intersectSet(arr1, arr2) {return [...new Set(arr1)].filter(item>arr2.includes(item)) } const values inter…

26593-2011 无损检测仪器 工业用X射线CT装置性能测试方法

声明 本文是学习GB-T 26593-2011 无损检测仪器 工业用X射线CT装置性能测试方法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了工业用X 射线CT 装置(以下简称CT 装置)性能测试的术语、定义、缩略语以及空间 分辨力、密度分辨率…

BChecks 自定义poc检测 - 把BurpSuite 打造成强大的漏洞扫描器

BChecks是什么&#xff1f; BChecks可以创建和导入的自定义扫描检查。Burp Scanner在执行其内置扫描例程的同时运行这些检查&#xff0c;帮助您定位扫描并使测试工作流尽可能高效。 每个BCheck都定义为一个以.bcheck文件扩展名结尾的纯文本文件。这些文件使用自定义语言来指定…

配置OSPF路由

OSPF路由 1.OSPF路由 1.1 OSPF简介 OSPF(Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09;路由协议是另一个比较常用的路由协议之一&#xff0c;它通过路由器之间通告网络接口的状态&#xff0c;使用最短路径算法建立路由表。在生成路由表时&#xff0c;…

Spring Cloud Netflix 教程和源码

本教程目标 想要系统地学习 Spring Cloud Netflix&#xff0c; 把自己的学习过程记录下来。 状态 持续更新中 微服务架构 微服务架构是一种将应用程序拆分为一组独立的、可独立部署的服务的架构模式。每个服务都运行在自己的进程中&#xff0c;可以独立地进行开发、测试和…

数据库管理-第108期 因Exadata存储节点操作系统空间异常的紧急处理(20230928)

数据库管理-第108期 因Exadata存储节点操作系统空间异常的紧急处理&#xff08;20230928&#xff09; 众所周知&#xff0c;明天放假了&#xff0c;本着对客户数据库软硬件负责任的态度&#xff0c;进行了一次深入彻底的软硬件巡检&#xff08;就是检查包括计算节点、存储节点…

vue3中状态适配

写一个函数&#xff0c;在函数中定义一个对象 用于存放键值对&#xff0c;最后返回指定状态所对应的的值&#xff0c;即对象[指定状态] 的 对象的值。 在模板中把状态传入 // vue3 setup语法糖中 const formatXXXState (xxxState)>{const stateMap {键1: 值1,键2: 值2,.…

Linux-正则三剑客

目录 一、正则简介 1.正则表达式分两类&#xff1a; 2.正则表达式的意义 二、Linux三剑客简介 1.文本处理工具&#xff0c;均支持正则表达式引擎 2.正则表达式分类 3.基本正则表达式BRE集合 4.扩展正则表达式ere集合 三、grep 1.简介 2.实践 3.贪婪匹配 四、sed …

VS+Qt+opencascade三维绘图stp/step/igs/stl格式图形读取显示

程序示例精选 VSQtopencascade三维绘图stp/step/igs/stl格式图形读取显示 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《VSQtopencascade三维绘图stp/step/igs/stl格式图形读取显示》编写…

postman安装使用教程

本文只是基于 Chrome 浏览器的扩展插件来进行的安装&#xff0c;并非单独应用程序。 首先&#xff0c;你要台电脑&#xff0c;其次&#xff0c;安装有 Chrome 浏览器&#xff0c;那你接着往下看吧。 1. 官网安装&#xff08;别看&#xff09; 打开官网&#xff0c;https://ww…

【计算机网络】P2P文件分发介绍

文章目录 P2P体系结构的自扩展性BitTorrent协议参考资料 考虑一个场景&#xff1a;从单一服务器向大量主机&#xff08;称为对等方&#xff09;分发一个大文件。 两种处理方式 客户-服务器文件分发&#xff1a;服务器需要向每个对等方发送该文件的一个副本 P2P文件分发&#xf…

使用代理后pip install 出现ssl错误

window直接设置代理 httphttp://127.0.0.1:7890;httpshttp://127.0.0.1