SwiftData实现两张独立数据表报错,求正确实现方案
SwiftData 实现两张数据表的正确方法
你的代码出现错误主要有三个核心问题,直接对应修正即可:
错误原因与修复步骤
问题1:
Test类未被标记为SwiftData模型
SwiftData只认带@Model宏的类作为数据表,你的Test类缺了这个标记,导致@Query和modelContext.insert都无法识别它。
修复:给Test类加上@Model宏,同时可以给id加上唯一约束避免重复数据:@Model final class Test { @Attribute(.unique) var id: Int init(id: Int) { self.id = id } }问题2:重复调用
modelContainer
不能多次链式调用.modelContainer,要一次性把所有需要的数据模型传入同一个modelContainer方法中。
修复:在Preview和App入口(如果是iOS 17+的App结构)中,用数组传入所有模型:.modelContainer(for: [Item.self, Test.self], inMemory: true)问题3:
@Query使用错误
你原代码中@Query private var TestItems: [Test]存在两个问题:一是Test当时还不是Model类型,二是变量名首字母大写违反Swift命名规范(应该小写开头)。
修复:修正变量名,确保查询的是合法的Model类型:@Query private var testItems: [Test]
完整修正代码
import Foundation import SwiftData @Model final class Item { var timestamp: Date init(timestamp: Date) { self.timestamp = timestamp } } @Model final class Test { @Attribute(.unique) var id: Int init(id: Int) { self.id = id } } import SwiftUI import SwiftData struct ContentView: View { @Environment(\.modelContext) private var modelContext @Query private var items: [Item] @Query private var testItems: [Test] var body: some View { NavigationSplitView { List { Section("Items") { ForEach(items) { item in NavigationLink { Text("Item at \(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard))") } label: { Text(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard)) } } .onDelete(perform: deleteItems) } Section("Tests") { ForEach(testItems) { test in NavigationLink { Text("Test ID: \(test.id)") } label: { Text("Test ID: \(test.id)") } } } } .toolbar { ToolbarItem(placement: .navigationBarTrailing) { EditButton() } ToolbarItem { Button(action: addItems) { Label("Add Items", systemImage: "plus") } } } } detail: { Text("Select an item") } } private func addItems() { withAnimation { let newItem = Item(timestamp: Date()) // 用随机ID避免重复,因为Test的id加了唯一约束 let newTest = Test(id: Int.random(in: 1...1000)) modelContext.insert(newItem) modelContext.insert(newTest) } } private func deleteItems(offsets: IndexSet) { withAnimation { for index in offsets { modelContext.delete(items[index]) } } } } #Preview { ContentView() .modelContainer(for: [Item.self, Test.self], inMemory: true) }
内容的提问来源于stack exchange,提问作者x001017
相关产品推荐
相关产品推荐

