首页 > 解决方案 > SwiftUI CoreData:在视图加载时将 CoreData 元素附加到数组中(或者有更好的方法吗?)

问题描述

在我当前的项目中,我第一次在 SwiftUI 中使用 Core Data。经过许多问题后,我现在可以使用以下代码在列表中显示数据:

@FetchRequest(entity: SensorData.entity(), sortDescriptors: []) var sensorData: FetchedResults<SensorData>

List(sensorData, id: \.self){temp in
            Text("\(temp.temperatur)")
        }

(数据被写入其他地方的 CoreData 模型并且工作正常)

在我的模型中,我有一个实体 (SensorData),它具有一个属性温度,类型为 Double。

所以,在那一点上,一切都很好,我得到了一个包含每个条目的列表。但我想在图表中显示数据,为此我需要 Double 数组中的条目。我该怎么做呢?我试过这个:

var temperatures: [Double] = []

init(){
    for temp in sensorData{
        temperatures.append(temp.temperatur)
    }
}

LineView(data: temperatures, title: "Temperatur")
            .padding()
            .frame(height: 500, alignment: .center)

在这里我得到错误:线程 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

此外,我已将属性的类型设置为 Transformabel 并设置为 [Double]。然后我将数据写入模型,如下所示:

if let temperatur = Double(temperatur){
   let sensorData = SensorData(context: self.viewContext)
   sensorData.temperatur?.append(temperatur)
                                                    
   try? self.viewContext.save()
}

但现在我得到了错误:

线程 1:致命错误:未解决的错误 Error Domain=NSCocoaErrorDomain Code=134140 “持久存储迁移失败,缺少映射模型。” UserInfo={destinationModel=(<NSManagedObjectModel: 0x600001044af0>) isEditable 0, entity { SensorData = "(<NSEntityDescription: 0x60000045c4d0>) name SensorData, managedObjectClassName SensorData, renamingIdentifier SensorData, isAbstract 0, superentity name (null), properties {\n tempatur = "(<NSAttributeDescription: 0x600001d7af80>), 名称 tempatur, isOptional

有人能帮助我吗?

标签: swiftxcodecore-dataswiftuidouble

解决方案


出现错误是因为您更改了数据模型。CoreData 正在尝试迁移到新模型,但无法确定如何进行。如果您正在开发中,只需从模拟器/设备中删除该应用程序并重新运行。

但我不确定你为什么要更改模型 - 你是否希望每个SensorData对象都有一个temperatur属性,它是一个Doubles数组?您之前的模型看起来不错,其中您有一个对象“数组” SensorData,每个对象都有(只有一个)Double 作为temperatur属性。要将 Doubles 作为数组传递给 LineView,请使用map

LineView(data: sensorData.map() { $0.temperatur }, title: "Temperatur")

推荐阅读