Swift & Core Data 解包 fetchedresults

Posted

技术标签:

【中文标题】Swift & Core Data 解包 fetchedresults【英文标题】:Swift & Core Data unwrapping fetchedresults 【发布时间】:2022-01-09 12:35:51 【问题描述】:

我对 ios 还很陌生,并试图了解如何使用 Core Data。我面临的基本挑战是从视图外部的 fetchResult 访问数据,就好像它在数组或数据库查询结果中一样(我认为这是) 示例:

Core Data Entity Foo 与 Core Data Entity Bar 是 1:1 的关系。我创建了一个需要附加到现有 Bar 的新 Foo。

我使用返回 fetchedResult 对象的谓词执行fetch<Bar>。我需要访问 fetchedResult 对象中的 Bar 对象,以便分配它:

newFoo.bar = fetched<Bar> 不起作用,我不知道如何到达Bar - 我花了大约 10 个小时阅读教程和 Apple 文档,但找不到任何解开它的方法或访问它 - 转换它或访问它,就像它只是一个简单的对象数组一样。

此时我即将放弃 - 我正在为实体创建重复的类,当应用程序启动时,我从每个实体加载所有核心数据并将其映射到可以轻松访问的数组,然后只需使用更改更新核心数据。这不可能是它应该的工作方式。

我错过了什么?这应该很容易。

编辑============================ 添加了简化的代码部分:

import Foundation
import CoreData

struct Create: View 
    @Environment(\.managedObjectContext) var viewContext
    @EnvironmentObject var show: ViewLogic

    func newOnDemand() 
        let newT = T(context: viewContext)
        let newS = S(context: viewContext)

        let existingPlace = Place.idRequest(id: placeId) <-- returns fetchedResults<Place>, I need Place or [Place]

        newT.place = existingPlace      <--- Place object required here. HOW?
        newT.S = newS                   <--- New Objects. Simple.
        do 
//              print("Saving session...")
              try viewContext.save()
           catch let error as NSError 
              print("Failed to save session data! \(error): \(error.userInfo)")
          

=========================== fetch
class Place: 
static func idRequest(id: UUID) -> NSFetchRequest<Place> 
        let request: NSFetchRequest<Place> = Place.fetchRequest()
            request.predicate = NSPredicate(format: "id == %@", id)
            request.sortDescriptors = [NSSortDescriptor(key: "sortOrder", ascending: true)]
          request.fetchLimit = 1    // use to specify specific queries. Position.
        return request

=========================== entity class
import Foundation
import CoreData


extension T 

    @nonobjc public class func fetchRequest() -> NSFetchRequest<T> 
        return NSFetchRequest<T>(entityName: "T")
    
    @NSManaged public var id: UUID

    @NSManaged public var place: Place?

【问题讨论】:

您能否提供minimal reproducible example 以便更容易专注于解决确切的问题? 【参考方案1】:

根据代码,方法idRequest 返回一个获取请求,而不是任何fetchresults。您必须在传递请求以获取数据的托管对象上下文上调用 fetch

let request = Place.idRequest(id: placeId)
do 
   if let existingPlace = try viewContext.fetch(request).first 
      newT.place = existingPlace
      // do other things
   
 catch 
   print(error)

【讨论】:

谢谢。我记得在文档中看到了一些关于这个的东西,但我从来没有意识到你必须先请求然后单独获取。我认为这是他们命名查询的“安全编码”方式。我将返回并重建我的“请求”函数以包含该提取操作,因为我无法想象我为什么要分离它们。

以上是关于Swift & Core Data 解包 fetchedresults的主要内容,如果未能解决你的问题,请参考以下文章

Swift & Core Data - 将实体添加到现有实体

swift 在Core Data中存储Swift值类型

Swift Core Data:Core Data 中的枚举 [重复]

Restkit, Swift, Core data 一对多

在 Swift 中的 Core Data 中保存数据

Core Data 使用 Swift 保存数据