【问题标题】:How do I fill an array of data with CoreData data?如何用 CoreData 数据填充数据数组?
【发布时间】:2020-12-31 15:56:22
【问题描述】:

我正在学习将 SwiftUI 与 Core Data 结合使用。

我正在尝试使用保存的重量数据填充折线图,如下所示:

LineView(data: [0, 32, 445, 56, 99])

我已经做到了这一点,但我在“var locations = ...”行上出现错误,说“表达式类型不明确,没有更多上下文”

var fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "UserWeight")
var locations = mocW.executeFetchRequest(fetchRequest, error: nil) as [UserWeight]

for weight in weights {
    print(weights.userWeight)    
}

对此以及我将如何用这些数据填充折线图的任何帮助将不胜感激!

【问题讨论】:

  • 您的标签之一是 SwiftUI,但您没有在问题中提及它,您的代码是 Swift。所以 1 如果你使用 SwiftUI,你应该考虑使用 @FetchRequest 属性包装器。
  • 如果您阅读FetchingObjects 的核心数据编程指南,您会看到一些详细说明。
  • 是的,我正在使用 SwiftUI,抱歉,我应该澄清一下。感谢您的评论生病看看! @andrewbuilder

标签: arrays swift core-data swiftui


【解决方案1】:

对于 SwiftUI,我怀疑您正在尝试实现以下目标...

struct YourView: View {

    @FetchRequest(entity: UserWeight.entity(),
                  sortDescriptors: []
    ) var weights: FetchedResults<UserWeight>
    
    var body: some View {
        ForEach(weights) { weight in
            Text(weight.userWeight)
        }
    }
}

核心数据实体符合Identifiable 协议,因此您可以在ForEach 结构中删除id: 参数...

ForEach(weights) { weight in

否则你需要使用...

ForEach(weights, id: \.self) { weight in

注意:顺便说一句,如果您以后可以在问题中提供更多详细信息,这将对我们有所帮助。您提供的信息越多,社区就越容易理解您的问题并提供合适的响应。请记住,您的问题和我们的回答不仅可以帮助您,还可以帮助将来访问该网站以寻找自己问题的答案的其他人。

How do I ask a good question?

【讨论】:

    【解决方案2】:

    如果UserWeightNSManagedObject 的子类,则应将获取请求声明为

    var fetchRequest = NSFetchRequest<UserWeight>(entityName: "UserWeight")
    

    否则为

    let fetchRequest: NSFetchRequest<UserWeight> = UserWeight.fetchRequest()
    

    那么就可以这样使用fetch了,locations的类型就是Array&lt;UserWeight&gt;

    let locations = try context.fetch(fetchRequest)
    

    我不确定executeFetchRequest(fetchRequest, error: nil) 的来源——它不是NSManagedObjectContext 在Swift 中定义的函数。它类似于 Objective-C 版本的函数,但在 Swift 中则不同。

    【讨论】:

    • 我应该澄清一下我正在为此使用 SwiftUI,如果你的代码可以工作,这会改变吗?我有一段时间无法访问我的电脑进行检查。感谢您的回复!
    【解决方案3】:
     if let appDelegate =
          UIApplication.shared.delegate as? AppDelegate {
            let managedObjectContext = appDelegate.persistentContainer.viewContext
            let fetchRequest = NSFetchRequest<Memory>(entityName: "Memory")
            let sortDescriptor = NSSortDescriptor(key: "rating", ascending: false)
            var predicate = NSPredicate(format: "mediaType == %@", "image")
            
            fetchRequest.predicate = predicate
            fetchRequest.sortDescriptors = [sortDescriptor]
            do {
                result = try managedObjectContext.fetch(fetchRequest)
            } catch {
                
            }
        }
    

    “结果”是一个数组,在我的例子中,内存对象是 NSManagedObject 的实例。要访问属性和填充视图,我这样做:

    for memory in result {
            let value = memory.entityPropertyName
            
        }
    

    我认为这应该足以让您入门,如果您还有其他问题,请告诉我。

    【讨论】:

    • 我应该澄清一下我正在为此使用 SwiftUI,如果你的代码可以工作,这会改变吗?我有一段时间无法访问我的计算机进行检查。感谢您的回复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2012-02-24
    • 2015-01-27
    • 2016-12-27
    相关资源
    最近更新 更多