美文网首页
CoreData学习

CoreData学习

作者: 王勋才 | 来源:发表于2021-08-12 21:19 被阅读0次
//
//  ContentView.swift
//  CDBootCamp
//
//  on 2021/8/13.
//参考自Nick Sarno

import SwiftUI
import CoreData//引入模块

class CoreDataViewModel: ObservableObject {
    //申明一个容器
    let container : NSPersistentContainer
    //建立一个可监听的水果实体数组
    @Published var savedEntities:[FruitEntity] = []
    //初始化容器
    init(){
        //用自己在Xcode建立的coredata文件初始化容器,注意名字必须与你建立的文件
        //一致FruitsContainer.xcdatamodeld。不包括xcdatamodeld这个部分
        container = NSPersistentContainer(name: "FruitsContainer")
        //加载持久存储并完成核心数据堆栈的创建
        container.loadPersistentStores { description, error in
            if let error = error {
                print("Loading core data wrong :\(error) ")
            }
        }
                        fetchFruits()//调用此方法,初始化entity数组
    }
    //申明请求  ----  尝试请求
    func fetchFruits(){
        //声明一个取回请求,类型是FruitEntity,名字是FruitEntity
        let request = NSFetchRequest<FruitEntity>(entityName: "FruitEntity")
        do {
            //调用viewContext的fetch方法尝试取回包含FruitEntity的数组
            savedEntities =  try container.viewContext.fetch(request)
        } catch let error {
            //失败则报错
            print(" Error Fetching \(  error    )")
        }
    }
    func addFruits(text:String){
        //实例化一个FruitEntity在view context里
        let newFruit = FruitEntity(context: container.viewContext)
        //进行更新操作
        newFruit.name = text
        //记得同步保存一下
        saveData()
    }
    func deleteFruits(indexSet:IndexSet){
        //获取索引
        guard    let index = indexSet.first else{return}
        //获取索引对应的实体数据,这些水果数据都在数组里
        let entity = savedEntities[index]
        //删除这个实体
        container.viewContext.delete(entity)
        //记得同步保存一下
        saveData()
    }
    func updateFruit(entity:FruitEntity){
        //传入实体,直接更新,保存
        let currentName = entity.name ?? "no name"
        let newName = currentName + "🍉"
        entity.name = newName
        saveData()
        
    }
    func saveData(){
        //fetchFruits可能会更新被监听的数组,从而刷新界面
        fetchFruits()
        do {
            try  container.viewContext.save()
           
        } catch let error {
            print("Saving Failure:\(error) ")
        }
       
    }
}
struct ContentView: View {
    @StateObject var vm = CoreDataViewModel()
    @State var textFieldText:String = ""
    var body: some View {
        NavigationView{
            VStack(spacing:20){
               TextField("Add fruits here ...", text: $textFieldText)
                .font(.headline)
                .frame(height:55)
                .padding(.leading,10)
                .background(Color(#colorLiteral(red: 0.921431005, green: 0.9214526415, blue: 0.9214410186, alpha: 1)))
                .cornerRadius(10)
                .padding(.horizontal,10)
               
                Button(action: {
                    guard !textFieldText.isEmpty else{return}
                    vm.addFruits(text: textFieldText)
                    textFieldText = ""
                }, label: {
                    Text("保存")
                        .font(.title)
                        .foregroundColor(.white)
                        .frame(height:55)
                        .frame(maxWidth:.infinity)
                        .background(Color(#colorLiteral(red: 0.8549019694, green: 0.250980407, blue: 0.4784313738, alpha: 1)))//背景色上色放最后
                        .cornerRadius(10)
                        .padding(.horizontal,10)
                    
                })

                List{
                    ForEach(vm.savedEntities) { fruite in
                        Text(fruite.name ?? "no data")
                            .onTapGesture {
                                vm.updateFruit(entity: fruite)
                            }
                    }
                    .onDelete(perform: vm.deleteFruits)
                }
            }
            .navigationTitle(Text("水果🍉"))
        }
    }
    
}


相关文章

  • CoreData和MJExtension结合遇到的问题

    最近在学习CoreData,在之前的学习Demo中进行测试学习,由于项目已经存在,现在需要引入CoreData框架...

  • CoreData

    CoreData学习 http://www.cnblogs.com/ios8/p/ios-coredata.htm...

  • coreData学习

    1 概念介绍 什么是coreData? coreData 是一个对象图管理器(object graph manag...

  • CoreData学习

    Coredata第一课 认识coredata 问题 在iOS/Mac中我们有许多方式去持久化存储数据:NSUser...

  • CoreData学习

    NSPersistentStoreCoordinator(持久存储协调器) 非线程安全,计划多线程同步访问一个数据...

  • CoreData学习

    //第一种方法全部加载 //nil表示从主bundles中加载对应的模型实体,其实会把程序中得所有的实体都加载了 ...

  • CoreData学习

  • 第五篇:CoreData

    CoreData 初识CoreData 基础使用CoreData 高级使用CoreData 使用进阶CoreDat...

  • coredata 5分钟上手教程

    iOS coredata 因学习曲线陡峭,所以用的人不多。为啥陡峭?因为coredata不走sql寻常路,自己全新...

  • SwiftUI中使用CoreData

    今天要学习的是如何在SwiftUI中使用CoreData。 知识点:1、已有项目添加CoreData2、Swift...

网友评论

      本文标题:CoreData学习

      本文链接:https://www.haomeiwen.com/subject/tqvjbltx.html