CoreData 在 swift UI 中的使用

简介: 当谈到在 Swift UI 中进行本地数据持久化,Core Data 是一个强大且常用的解决方案。Core Data 是苹果提供的一种数据存储和管理框架,用于在应用程序中创建、读取、更新和删除数据。它提供了一个对象图管理器,可以将数据映射到对象,并提供了一种简化数据操作的方式。在本文中,我们将深入介绍 Core Data 在 Swift UI 中的使用。

CoreData 在 swift UI 中的使用

>
>

当谈到在 Swift UI 中进行本地数据持久化,Core Data 是一个强大且常用的解决方案。Core Data 是苹果提供的一种数据存储和管理框架,用于在应用程序中创建、读取、更新和删除数据。它提供了一个对象图管理器,可以将数据映射到对象,并提供了一种简化数据操作的方式。在本文中,我们将深入介绍 Core Data 在 Swift UI 中的使用。

Core Data 简介

Core Data 是一个基于对象图管理的框架,它允许你将数据模型映射到 Swift 类,并提供了一种高级抽象,用于处理数据的创建、存储和检索。它支持多种数据存储后端,包括 SQLite、In-Memory 和二进制文件。使用 Core Data 可以有效地管理应用程序的数据,减少手动数据管理的复杂性。

创建 Core Data 模型

在使用 Core Data 之前,首先需要创建一个数据模型。这个模型定义了你的数据结构,包括实体(Entity)、属性(Attribute)和关系(Relationship)。你可以使用 Xcode 中的数据模型编辑器来创建和设计模型,然后生成相应的 Swift 类。

image-20230809141943793

首先创建模型(这里的模型就类似于数据库,我是做后端的,所以会有这个比喻。如果对后端不熟悉的可以忽略),这里我们命名为 Reader,创建完之后,如下图所示:

image-20230809142035430

我们点击 Add Entity 按钮来创建 Entity(这里可以类似于数据库中的表)这里我们创建了 Book 的Entity, 给 Entity 命名之后,开始给Entity 定义属性,在下图的 Attribute 点击加号来添加属性:

image-20230809142106164

定义完成之后,我们来生成对应的实体类

image-20230809143422161

按照上述的操作完成后,就得到了这样的swift 文件

import Foundation
import CoreData


public class Book: NSManagedObject {
    
    

}

import Foundation
import CoreData


extension Book {
    
    

   @nonobjc public class func fetchRequest() -> NSFetchRequest<Book> {
    
    
       return NSFetchRequest<Book>(entityName: "Book")
   }

   @NSManaged public var bookId: UUID?
   @NSManaged public var bookName: String?
   @NSManaged public var createTime: Date?

}

extension Book : Identifiable {
    
    

}

下面我们来介绍如何在代码中使用创建的 Entity ,并进行 CURD 操作

初始化 Core Data 堆栈

//DataSource.swift

import Foundation
import CoreData

public class DataSource : ObservableObject{
    
    

   let container = NSPersistentContainer(name: "Reader");

   init() {
    
    
       container.loadPersistentStores {
    
     description, error in
           print("description is ===> \(description)")
           if let error = error {
    
    
               fatalError("Unable to load persistent stores: \(error)")
           }
       }
   }

}

//ReaderApp.swift

@main
struct Reader_Watch_AppApp: App {
    
    

   @StateObject private var datasource = DataSource();

   var body: some Scene {
    
    
       WindowGroup {
    
    
           ContentView()
               .environment(\.managedObjectContext, datasource.container.viewContext)
       }
   }
}

检索数据

import SwiftUI

struct BookList: View {
    
    

//    var bookList : [String] = ["盗墓笔记", "21 天精通 JAVA", "C++ 从入门到精通", "金瓶梅", "三体"];

   @Environment(\.managedObjectContext) private var viewContext;

   @FetchRequest(
       sortDescriptors: [NSSortDescriptor(keyPath: \Book.createTime, ascending: true)],
       animation: .default
   )
   private var bookList: FetchedResults<Book>

   var body: some View {
    
    
       List(bookList, id: \.self){
    
     book in
           let bookName = book.bookName!;
           NavigationLink(destination: BookContent(book: Book1(bookName))) {
    
    
               Text(bookName)
           }
       }
       .navigationTitle {
    
    
               HStack{
    
    
                   Text("书架").foregroundColor(.orange)
                   Spacer()
               }
           }
   }
}

更新和删除数据

if let item = items.first {
    
    
   item.name = "Updated Name"

   do {
    
    
       try viewContext.save()
   } catch {
    
    
       // 处理错误
   }
}

if let itemToDelete = items.first {
    
    
   viewContext.delete(itemToDelete)

   do {
    
    
       try viewContext.save()
   } catch {
    
    
       // 处理错误
   }
}
//项目中代码
List(bookList, id: \.self){
    
     book in
           let bookName = book.bookName!;
           NavigationLink(destination: BookContent(book: Book1(bookName))) {
    
    
               Text(bookName)
           }.swipeActions(edge: .trailing, allowsFullSwipe: false) {
    
    
               Button(action: {
    
    
                   if let bookToDelete = bookList.first(where: {
    
    $0 == book}) {
    
    
                       viewContext.delete(bookToDelete)
                       do {
    
    
                           try viewContext.save()
                       } catch {
    
    
                           // 处理错误
                       }
                   }
               }) {
    
    
                   Text("删除")
//                        .foregroundColor(.white)
//                        .padding()
//                        .background(Color.red)
               }
           }
       }
       .navigationTitle {
    
    
               HStack{
    
    
                   Text("书架").foregroundColor(.orange)
                   Spacer()
               }
           }
   }

Core Data 是一个强大的数据管理框架,可以在 Swift UI 中轻松实现本地数据持久化。通过创建数据模型、初始化 Core Data 堆栈、使用上下文进行数据操作,以及在视图中展示数据,可以构建出自己的应用程序。

相关文章
SwiftUI 面面观
前言 Swift 5.1 新语法 单表达式隐式返回值 根据结构体默认成员合成默认初始化器 字符串插入运算符新设计 属性包装器 不透明返回类型 Swift Style DSL / Function Builder 其他新特性 Swift 从 3.x Attribute Swift/SwiftUI API Design Guide 值类型和引用类型
1475 0
SwiftUI直通车系列(6)—— 使用动画
SwiftUI直通车系列(6)—— 使用动画
187 0
|
iOS开发
SwiftUI直通车系列(3)—— 使用导航
SwiftUI直通车系列(3)—— 使用导航
270 0
SwiftUI直通车系列(3)—— 使用导航
|
前端开发 安全 程序员
详解 WWDC 20 SwiftUI 的重大改变及核心优势
随着 WWDC 20 相关新特性和介绍视频的释出,都明确的宣告着 SwiftUI 元年已经到了,SwiftUI 已经成长为新时代的布局引擎。 以下从几个方面分享关于 SwiftUI 的重大改变及核心优势。
2872 0
详解 WWDC 20 SwiftUI 的重大改变及核心优势
|
前端开发 Swift
Swift UI对Flutter的意义;JSConf 2019归来记;未来属于声明式编程丨体验科技精选第 4 期
这里是蚂蚁金服体验科技精选 第 4 期,本期内容包括原创精选、蚂蚁前端动态和行业动态,内涵福利。
5375 0
Swift UI对Flutter的意义;JSConf 2019归来记;未来属于声明式编程丨体验科技精选第 4 期
|
前端开发 Android开发 开发者
SwiftUI 初体验
前言 苹果在 WWDC 2019 的开幕式中给我们来带了超多的惊喜,全新的iPad OS, 给生产力和商业带来了新领域,iOS 项目可以通过简单的修改移植到 Mac OS 上,全新的 Mac Pro 高清的显示器等新硬件,但对于在苹果平台的开发者们,最重要的莫过于 Swift UI。
5918 0
swift UI专项训练4 场景过渡-转场
    上一话中我们创建了两个场景,这一话我们想要实现两个场景间的过渡。我们只需要增加一个导航条。
832 0
|
iOS开发
swift UI专项训练5 定制视图控制器
  我们现在已经添加了两个场景了,尽管我们有默认的视图控制器,但是我们还是想自己定制一下自己的控制器,我们之前一直在storyboard上做操作,现在来些一些代码。
868 0
Swift UI专项训练6 反向过渡
  上一话中我们第二个场景设置过渡的时候选择的是modal类型,不是push。所以用户输入后需要手工返回。
849 0
|
小程序 Swift 数据安全/隐私保护
Swift UI专项训练1 交互
     我们都知道在IOS界面编程的时候有IBOutlet和IBAction,前者是引用后者是操作,IBAction有一个参数sender,用来指向操作对象,之前我发布的天气预报的小程序那一话可以看到,如果我们需要一个按钮的点击事件的话那就使用IBAction,如果是一个Label要显示东西的话那就用IBOutlet。
878 0

相关课程

更多