项目属性匹配
紧接着,我们还要改造下Model数据模型中的文件,使其声明的属性和数据库中的属性一一匹配,如下代码所示:
import CoreData import Foundation import SwiftUI public class Model: NSManagedObject,Identifiable { @NSManaged public var id: UUID @NSManaged public var platformIcon: String @NSManaged public var title: String @NSManaged public var platformName: String @NSManaged public var indexURL: String enum CodingKeys: String, CodingKey { case platformIcon, title, platformName, indexURL } }
上述代码中,由于CoreData模型类继承自NSManagedObject协议,每个属性都使用@NSManaged进行声明。
引用数据库
定义好数据模型后,我们来到ContentView视图,我们使用@FetchRequest属性包装器从数据库加载数据,并且注释原来的@StateObject声明的viewModel,如下代码所示:
@FetchRequest(entity: Model.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Model.title, ascending: false)]) var models: FetchedResults<Model>
紧接着我们替换掉原来viewModel模式视图数据遍历的List列表,如下图所示:
这时可能出现很多报错,这是因为我们替换了原来的viewModel模型视图中的models数据集,因此在很多使用models数据集进行数据传输的地方都会找不到对象而报错。
这没关系,我们一点点修复它。
修改NewView新建视图
我们先来到NewView新建身份卡视图,我们需要声明一个环境变量来管理对象上下文,而且还需要注释原来的viewModel视图模型,如下代码所示:
@Environment(.managedObjectContext) var context
添加身份卡的方法我们也需要重新设计,并且注释之前的代码,如下代码所示:
// 赋值 let newItem = Model(context: context) newItem.id = UUID() newItem.platformIcon = platformIcon newItem.title = title newItem.platformName = platformName newItem.indexURL = indexURL // 保存 do { try context.save() } catch { print(error) }
上述代码中,我们声明了一个常量newItem来获得Model数据库实体的数据类型,然后给实体的参数赋值,最后调用save方法保存数据。