如何在 SwiftUI 中使用 CoreData 更改数据值?

Posted

技术标签:

【中文标题】如何在 SwiftUI 中使用 CoreData 更改数据值?【英文标题】:How can I change a data value with CoreData in SwiftUI? 【发布时间】:2019-09-05 23:38:39 【问题描述】:

使用 CoreData 和 SwiftUI 更改数据的值

我正在尝试使用列表中单元格上的按钮(心脏)修改数据的布尔值isFavorite

模型数据

import Foundation
import CoreData

public class VoitureItem: NSManagedObject, Identifiable 


    @NSManaged public var marque: String?
    @NSManaged public var modele: String?
    @NSManaged public var annee: String?
    @NSManaged public var energie: String?
    @NSManaged public var kilometrage: String?
    @NSManaged public var isFavorite: Bool



extension VoitureItem 
    static func getAllVoitureItems() -> NSFetchRequest<VoitureItem> 

        let request:NSFetchRequest<VoitureItem> = VoitureItem.fetchRequest() as! NSFetchRequest<VoitureItem>

        let sortDescriptor = NSSortDescriptor(key: "isFavorite", ascending: false)

        request.sortDescriptors = [sortDescriptor]

         return request   
      

我在ContentView 中使用managedObjectCOntextFetchRequest 来显示List 中的所有数据并创建新数据。 我想知道如何在我的 CoreData 中单击按钮更改 isFavorite 的值。

ContentView()(主视图)

struct ContentView: View 

    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(fetchRequest: VoitureItem.getAllVoitureItems()) var voitureItems: FetchedResults<VoitureItem>


    var body: some View 
        NavigationView 
            List //show list of all the data
        
     

单元格上的按钮

Button(action: 

                //var fav: Bool = false
                print("favorite")

                //HERE - Change isFavorite in coreData

            ) 
                if isFavorite 
                    Image(systemName: "heart.fill")
                        .foregroundColor(Color.yellow)
                 else 
                    Image(systemName: "heart")
                        .foregroundColor(Color.gray)
                
            

【问题讨论】:

【参考方案1】:

这样的事情应该可以工作。

List(voitureItems)  item in
    ItemCell(item: $item)

...

struct ItemCell: View 

    @Binding var item: VoitureItem

    var body: some View 
        Button(action: 
            item.isFavourite.toggle()
        ) 
            if item.isFavourite 
                Image(systemName: "heart.fill")
                    .foregroundColor(Color.yellow)
             else 
                Image(systemName: "heart")
                    .foregroundColor(Color.gray)
            
        
    

【讨论】:

我尝试使用您的答案,但item: $item 给了我一个错误:Use of unresolved identifier '$item' 尝试不带 $

以上是关于如何在 SwiftUI 中使用 CoreData 更改数据值?的主要内容,如果未能解决你的问题,请参考以下文章

使用 CloudKit + CoreData,如何在没有 SwiftUI 的 @FetchRequest 的情况下从远程云更新中更新 UI?

SwiftUI CoreData - 如何更新获取请求和列表

在 CoreData 记录中进行更改,SwiftUI

如何将 SwiftUI 中的颜色类型存储到 CoreData 中?

SwiftUI - 如何在 CoreData 中删除实体中的行

SwiftUI 使用 CoreData 从列表中编辑项目