You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 07:42:47