更新 SwiftData 中的数据

Pay*_*DEV 2 swift swift-data swiftui

我正在尝试更新 SwiftData 中的数据。然而,该文档实际上只是:

func update(expressions: [String : NSExpression], 
    model: any PersistentModel.Type,
    where predicate: NSPredicate? = nil) throws -> Bool
Run Code Online (Sandbox Code Playgroud)

作为一名新开发人员,我不知道其中大部分意味着什么或如何使用它。我的代码如下:

try? context.update(expressions ["teamScores":NSExpression(format: "\(teamScores)")], model: CounterModel.self)
Run Code Online (Sandbox Code Playgroud)

它失败了exception of type NSException

老实说,我没能尝试太多。截至撰写本文时,这样一个新框架实际上已经在 6 天前发布,除了设置模型、保存数据和查询数据库之外,没有太多文档或示例。

Dar*_*ary 5

要更新 SwiftData 中的数据,我们不需要直接接触 modelContext。我们只需要更新实例,数据就会自动更新。

这是一个简单的添加列表项目并在 didTapped 时跟踪列表的示例:

@Model final class AnyItem {
    var name: String
    var didTapped: Bool = false
    init(name: String) {
        self.name = name
    }
}

struct ContentView: View {
    @State var itemName: String = ""
    @Environment(\.modelContext) private var modelContext
    @Query var items: [AnyItem]
    
    var body: some View {
        NavigationStack {
            List {
                Section {
                    TextField("Item name", text: $itemName)
                    Button("Submit", action: addItem)
                }
                
                ForEach(items) { item in
                    Section {
                        Text(item.name)
                        Text("Did tapped: \(item.didTapped.description)")
                    }
                    .onTapGesture {
                        updateItem(item)
                    }
                }
            }
        }
    }
    
    private func addItem() {
        withAnimation {
            let newItem = AnyItem(name: itemName)
            modelContext.insert(newItem)
            itemName = ""
        }
    }
    
    private func updateItem(_ item: AnyItem) {
        withAnimation {
            item.didTapped = true
        }
    }
}

#Preview {
    ContentView()
        .modelContainer(for: AnyItem.self, inMemory: true)
}
Run Code Online (Sandbox Code Playgroud)