首页 > 解决方案 > 更新 Core Data 值,SwiftUI

问题描述

我有一个对象列表:

@FetchRequest(entity: ObjectDetail.entity(), sortDescriptors: []) var myObject: FetchedResults<ObjectDetail>

我的 ObjectDetail 是我的 .xcdatamodel 中的一个实体,其结构如下:

listOfObject: Transformable (List of custom object)
objectId: UUID
objectName: String
objectDescription: String

对象列表:

public class ListOfObject: NSObject, NSCoding, ObservableObject {
...
}

我正在尝试更新我的 listOfObject 中的一个元素。

到目前为止,我尝试了以下 3 种方法:

  1. 第一种方法:

    mangedObjectContext.performAndWait {
        self.elementFromListOfObject.objectWillChange.send()
        elementFromListOfObject.weight = 0
        try? mangedObjectContext.save()
    }
    
  2. 第二种方法:

    if let selectedObject = self. myObject.first(where: {$0.objectName == self.currentSelectedObjectName}) {
        if let selectedElementFromListOfObject = selectedObject.myList?.myListOfObject.first(where: {$0 == self.currentSelectedObject }) {
            selectedElementFromListOfObject.weight = 0
            self.excercise.objectWillChange.send()
            saveContext()
        }
    }
    
  3. 第三种方法

    do {
        let request = NSBatchUpdateRequest(entity: ObjectDetail.entity())
        request.resultType = .updatedObjectIDsResultType
        request.propertiesToUpdate = ["weight": 0]
    
        let result = try mangedObjectContext.execute(request) as? NSBatchUpdateResult
        let objectIDArray = result?.result as? [NSManagedObjectID]
        let changes = [NSUpdatedObjectsKey: objectIDArray]
        NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes as [AnyHashable : Any], into: [mangedObjectContext])
    } catch {
        let nsError = error as NSError
        fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
    }
    

第三个崩溃了,因为它说 request.propertiesToUpdate 为空,其他方法保存该值,但是当我重新启动应用程序时,它是默认值。

在 SwiftUI 中更新 Core Data 中的值的最佳方法是什么?

标签: swiftcore-dataswiftui

解决方案


推荐阅读