Skip to content

在 SwiftUI 视图中处理 SwiftData 的增删改查

SwiftData 基础操作:增

在 SwiftUI 视图中处理 SwiftData 的增删改查,是构建数据驱动应用的核心。 首先,我们来看看如何添加新数据。 你可以使用 @Environment(\.modelContext) 属性包装器来获取模型上下文。 这是一个非常方便的方式! 🚀

例如,你可以创建一个按钮,点击后向数据库中添加一个新的 Item 对象。

swift
struct ContentView: View {
    @Environment(\.modelContext) private var modelContext

    var body: some View {
        Button("添加新项目") {
            let newItem = Item(timestamp: Date())
            modelContext.insert(newItem)
        }
    }
}

这行代码 modelContext.insert(newItem) 负责将你的新数据保存到持久化存储中。 真是太棒了!

SwiftData 基础操作:查

查询数据同样简单直观。 你可以使用 @Query 宏来声明一个查询,它会自动为你获取并更新数据。 这意味着你的视图会随着数据的变化而自动刷新。 真是省心! ✨

swift
struct ItemListView: View {
    @Query var items: [Item]

    var body: some View {
        List {
            ForEach(items) { item in
                Text("项目时间: \(item.timestamp, formatter: itemFormatter)")
            }
        }
    }

    private let itemFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateStyle = .short
        formatter.timeStyle = .medium
        return formatter
    }()
}

@Query 宏可以接受参数,例如排序描述符或谓词,以实现更复杂的查询。 你可以轻松地筛选和排序你的数据。

SwiftData 基础操作:改

修改现有数据也非常直接。 你只需要获取到要修改的对象,然后直接更新它的属性即可。 SwiftData 会自动检测到这些变化并将其保存。 简直是魔法! 🪄

  1. 首先,通过 @Query 获取到需要修改的数据。
  2. 然后,在你的视图中,找到你想要更新的特定 Item
  3. 直接修改 Item 对象的属性。

例如,你可以创建一个 EditItemView

swift
struct EditItemView: View {
    @Bindable var item: Item

    var body: some View {
        TextField("修改时间", value: $item.timestamp, formatter: DateFormatter())
    }
}

item 的属性被修改时,SwiftData 会自动处理数据的持久化。

SwiftData 基础操作:删

删除数据同样简单。 你可以通过 modelContext.delete() 方法来删除一个对象。

swift
struct ItemListView: View {
    @Environment(\.modelContext) private var modelContext
    @Query var items: [Item]

    var body: some View {
        List {
            ForEach(items) { item in
                Text("项目时间: \(item.timestamp, formatter: itemFormatter)")
            }
            .onDelete(perform: deleteItems)
        }
    }

    private func deleteItems(offsets: IndexSet) {
        for index in offsets {
            modelContext.delete(items[index])
        }
    }
}

onDelete 修饰符在 List 中非常有用,它允许用户通过滑动来删除行。 这种用户体验非常流畅! 💯 掌握这些增删改查的基本操作,你就能轻松构建强大的数据驱动型 SwiftUI 应用了。

本站使用 VitePress 制作