//
// ContentView.swift
// CoreDataMVVM
//
// Created by shiyanjun on 2023/1/26.
//
import SwiftUI
import CoreData
// CoreData视图模型类,负责CoreData的增删改查
class CorDataViewModel: ObservableObject {
// CoreData持久化容器对象
let container: NSPersistentContainer
// 存放水果的数组,用于展示水果列表
@Published var savedEntitys: [FruitEntity] = []
// 初始化
init() {
// 初始化CoreData持久化容器示例
container = NSPersistentContainer(name: "FruitsContainer")
container.loadPersistentStores { descreption, error in
if let error = error {
print("ERROR LOADING CORE DATA. \(error)")
} else {
print("Successfully loaded core data!")
}
}
fetchFruits()
}
// 从CoreData数据库中加载水果列表
func fetchFruits() {
let request = NSFetchRequest<FruitEntity>(entityName: "FruitEntity")
do {
savedEntitys = try container.viewContext.fetch(request)
} catch let error {
print("Error fetching. \(error)")
}
}
// 添加水果
func addFruit(text: String) {
let newFruit = FruitEntity(context: container.viewContext)
newFruit.name = text
saveData()
}
// 更新水果
func updateFruit(entity: FruitEntity) {
let currentName = entity.name ?? ""
let newName = currentName + "!"
entity.name = newName
saveData()
}
// 删除水果
func deleteFruit(indexSet: IndexSet) {
guard let index = indexSet.first else { return }
let entity = savedEntitys[index]
container.viewContext.delete(entity)
saveData()
}
// 公用保存方法
func saveData() {
do {
try container.viewContext.save()
fetchFruits()
} catch let error {
print("Error saving. \(error)")
}
}
}
// 应用的主页面
struct ContentView: View {
// 创建CoreData视图模型实例
@StateObject var vm = CorDataViewModel()
// 记录用户输入的水果名称
@State var textFieldText: String = ""
var body: some View {
NavigationView {
VStack(spacing: 20) {
// 水果名称输入框
TextField("Add fruit here...", text: $textFieldText)
.font(.headline)
.padding(.leading)
.frame(height: 55)
.background(Color(.gray).opacity(0.1))
.cornerRadius(10)
.padding(.horizontal)
// 添加水果的按钮
Button {
guard !textFieldText.isEmpty else { return }
vm.addFruit(text: textFieldText)
textFieldText = ""
} label: {
Text("Submit")
.font(.headline)
.foregroundColor(.white)
.frame(height: 55)
.frame(maxWidth: .infinity)
.background(.pink)
.cornerRadius(10)
}
.padding(.horizontal)
// 展示水果列表
List {
ForEach(vm.savedEntitys) { entity in
Text(entity.name ?? "NO NAME")
.onTapGesture {
vm.updateFruit(entity: entity)
}
}
.onDelete(perform: vm.deleteFruit)
}
.listStyle(PlainListStyle())
}
.navigationTitle("Fruits")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter