Core Data保存Double变量失败,重启App数据丢失求助
Core Data 数据持久化问题修复方案
核心问题分析
- 重复创建对象而非更新:每次点击按钮都新建
Statsohs实例,导致Core Data中存储多条冗余记录,重启后无法正确读取最新值 - 数据读取后未同步UI:
fetchStats仅获取数据到数组,但未将保存的数值赋值给number变量,也未更新Label显示
修复后的代码
import UIKit import CoreData class ViewController: UIViewController { // 托管对象上下文引用 let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext // 存储统计数据对象 var stats: Statsohs? var number: Double = 0 @IBOutlet weak var LabelStats: UILabel! override func viewDidLoad() { super.viewDidLoad() fetchStats() } @IBAction func ActionButton(_ sender: UIButton) { number += 10 // 若已有统计对象则更新,无则创建 if let existingStats = stats { existingStats.value = number } else { stats = Statsohs(context: context) stats?.value = number } LabelStats.text = String(format: "%.2f", number) // 保存数据并处理错误 do { try context.save() } catch { print("保存失败: \(error.localizedDescription)") } } func fetchStats() { do { // 获取所有统计记录,取最新的一条 let results = try context.fetch(Statsohs.fetchRequest()) if let latestStats = results.last { stats = latestStats number = latestStats.value LabelStats.text = String(format: "%.2f", number) } else { // 无记录时初始化默认值 LabelStats.text = String(format: "%.2f", number) } } catch { print("获取数据失败: \(error.localizedDescription)") } } }
关键修改说明
- 单对象维护:用
stats变量存储单个Statsohs对象,避免每次点击创建新实例 - 数据读取同步:
fetchStats中读取到保存的值后,立即赋值给number并更新Label - 错误处理完善:添加错误打印,方便调试保存或读取失败的问题
- 逻辑优化:点击按钮时优先更新已有对象,无对象再创建,保证数据唯一性
更简便的单值存取方案
如果只是存储单个Double值,也可以直接用UserDefaults,代码更简洁:
// 保存 UserDefaults.standard.set(number, forKey: "AverageValue") // 读取 number = UserDefaults.standard.double(forKey: "AverageValue")
但如果后续需要扩展更多统计字段,Core Data依然是更合适的选择。
内容的提问来源于stack exchange,提问作者Marc S.
相关产品推荐
相关产品推荐

