swift - 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
有人能帮助我吗?
解决方案
出现错误是因为您更改了数据模型。CoreData 正在尝试迁移到新模型,但无法确定如何进行。如果您正在开发中,只需从模拟器/设备中删除该应用程序并重新运行。
但我不确定你为什么要更改模型 - 你是否希望每个SensorData
对象都有一个temperatur
属性,它是一个Doubles数组?您之前的模型看起来不错,其中您有一个对象“数组” SensorData
,每个对象都有(只有一个)Double 作为temperatur
属性。要将 Doubles 作为数组传递给 LineView,请使用map
:
LineView(data: sensorData.map() { $0.temperatur }, title: "Temperatur")
推荐阅读
- c# - Word 加载项:根据文档的路径禁用“另存为”
- python - 将字符串元组链接到交叉表数据框
- javascript - 如何在 JS 中为无限跑步者类型的游戏制作无尽的画布
- node.js - 从 mongodb 数组中提取元素
- multithreading - ExecutorService 使用 Stream 时不并行执行线程
- javascript - 如何预防
导出 javascript DataTable 时显示 - android - FT232R 设备的 USB 串口的 Android requestWait 没有被阻塞
- python-3.x - 多页上的 Tkinter 串行数据
- shell - 杀死一个 Docker 容器
- c# - 给定从 0 开始的字符串绝对索引,确定从 1 开始的行号和列号(C#)