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

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)")
        }
    }
}

关键修改说明

  1. 单对象维护:用stats变量存储单个Statsohs对象,避免每次点击创建新实例
  2. 数据读取同步:fetchStats中读取到保存的值后,立即赋值给number并更新Label
  3. 错误处理完善:添加错误打印,方便调试保存或读取失败的问题
  4. 逻辑优化:点击按钮时优先更新已有对象,无对象再创建,保证数据唯一性

更简便的单值存取方案

如果只是存储单个Double值,也可以直接用UserDefaults,代码更简洁:

// 保存
UserDefaults.standard.set(number, forKey: "AverageValue")
// 读取
number = UserDefaults.standard.double(forKey: "AverageValue")

但如果后续需要扩展更多统计字段,Core Data依然是更合适的选择。

内容的提问来源于stack exchange,提问作者Marc S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 22:22:29