单例中SwiftData数据变更无法持久化的问题求助
SwiftData 单例DatabaseManager数据无法持久化的问题解决
你的代码核心问题有两个:
modelContainer被定义成了计算属性,每次访问这个属性都会创建一个全新的ModelContainer实例。这意味着你调用addItem()时用的是一个容器,UI绑定的是另一个容器,数据完全不共享;每次调用itemCount()也会创建新容器,自然查不到之前插入的数据。- 插入数据后没有调用上下文的
save()方法,即使容器正确,变更也不会被持久化到磁盘。
修正后的代码如下:
import SwiftData import SwiftUI @Model class Item { var name: String init(name: String) { self.name = name } } class DatabaseManager { static let shared = DatabaseManager() // 改为存储属性,仅初始化一次 let modelContainer: ModelContainer private init() { do { modelContainer = try ModelContainer(for: Item.self) print(modelContainer.configurations.first?.url.path ?? "No database file") } catch { fatalError("Unable to create ModelContainer: \(error)") } } @MainActor func addItem() { let item = Item(name: UUID().uuidString) modelContainer.mainContext.insert(item) // 保存上下文,持久化变更 do { try modelContainer.mainContext.save() } catch { print("Failed to save context: \(error)") } } @MainActor func itemCount() -> Int { let fetchDescriptor = FetchDescriptor<Item>() do { let items = try modelContainer.mainContext.fetch(fetchDescriptor) return items.count } catch { print("Failed to fetch items: \(error)") return 0 } } }
关键修改说明:
- 将
modelContainer从计算属性改为存储属性,确保整个App生命周期内只有一个容器实例,所有数据操作共享同一个上下文。 - 在
addItem()方法中添加上下文保存逻辑,把内存中的数据变更写入磁盘,同时让UI能感知到数据更新。
内容的提问来源于stack exchange,提问作者Travis M.
相关产品推荐
相关产品推荐

