gpt4 book ai didi

具有自定义类类型的 Swift CoreData 保存属性

转载 作者:行者123 更新时间:2023-11-28 13:27:29 27 4
gpt4 key购买 nike

我刚开始使用 CoreData 作为数据库来存储用户数据以支持离线应用程序使用。我已经为我的对象设置了数据模型,一些属性必须存储在我的其他对象类的类型中。但是,它似乎已成功保存,但是当我尝试从数据库中获取结果时它返回 nil 。我还查看了 SQLite 数据库文件,看看存储到 CoreData 中的字段发生了什么,结果是 nil (并且发现返回类型是 Optional(Any)), 发现数据的属性以BLOB的类型存储。

存储在SQLite中的结果:

SQLite Database

最初,我的应用程序只能在网络可用时使用,但我正在尝试将其转为支持离线访问。然而,我一直坚持这些问题,不知道如何解决它,甚至我不确定我是否在做正确的事情。

我的自定义对象类 StudentMarkList 的示例之一:

import Foundation
import UIKit
import CoreData

@objc(StudentMarkList)

class StudentMarkList: NSObject {
var id = Int() // Student ID in DB (Primary Key)
var paperId = String() // Paper ID which the student attended
var studentClass = String() // Student class
var totalMark = Int() // Total mark of the attended paper
var allMarked = Bool() // Flag whether student's paper is all marked
var markList = [MarkList]() // Array of marks for each question <- Custom object class of defining the structure of each question's mark

override init() {
super.init()
}

init(id:Int, paperId:String, studentClass:String, totalMark:Int, allMarked:Bool, markList:[MarkList]){
self.id = id
self.paperId = paperId
self.studentClass = studentClass
self.totalMark = totalMark
self.allMarked = allMarked
self.markList = markList
}

func save() {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}

let managedContext = appDelegate.persistentContainer.viewContext
managedContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

let entity = NSEntityDescription.entity(forEntityName: "StudentMarkList", in: managedContext)!
let studentMarkList = NSManagedObject(entity: entity, insertInto: managedContext)

studentMarkList.setValue(self.id, forKey: "id")
studentMarkList.setValue(self.paperId, forKey: "paperId")
studentMarkList.setValue(self.studentClass, forKey: "studentClass")
studentMarkList.setValue(self.totalMark, forKey: "totalMark")
studentMarkList.setValue(self.allMarked, forKey: "allMarked")
studentMarkList.setValue(self.markList, forKey: "markList")

if managedContext.hasChanges {
do {
try managedContext.save()
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
}
}
}

StudentMarkList 模型:

StudentMarkList model

对应的自定义对象类MarkList:

import Foundation
import UIKit
import CoreData

@objc(MarkList)

class MarkList: NSObject, NSCoding {
func encode(with aCoder: NSCoder) {
aCoder.encode(questionId, forKey: "questionId")
aCoder.encode(questionNo, forKey: "questionNo")
aCoder.encode(questionMark, forKey: "questionMark")
}

required init?(coder aDecoder: NSCoder) {
guard let questionId = aDecoder.decodeObject(forKey: "questionId") as? Int,
let questionNo = aDecoder.decodeObject(forKey: "questionNo") as? Int,
let questionMark = aDecoder.decodeObject(forKey: "questionMark") as? String else {
return nil
}
self.questionId = questionId
self.questionNo = questionNo
self.questionMark = questionMark
}

var questionId = Int()
var questionNo = Int()
var questionMark = String()

override init() {
super.init()
}

init(questionId: Int, questionNo: Int, questionMark: String) {
self.questionId = questionId
self.questionNo = questionNo
self.questionMark = questionMark
}

func save() {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}

let managedContext = appDelegate.persistentContainer.viewContext
managedContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

let entity = NSEntityDescription.entity(forEntityName: "MarkList", in: managedContext)!
let markList = NSManagedObject(entity: entity, insertInto: managedContext)

markList.setValue(self.questionId, forKey: "questionId")
markList.setValue(self.questionNo, forKey: "questionNo")
markList.setValue(self.questionMark, forKey: "questionMark")

if managedContext.hasChanges {
do {
try managedContext.save()
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
}
}
}

MarkList模型:

MarkList model

函数save()用于将实例作为对应的对象类保存到CoreData。

希望有人能帮助我或澄清我使用 CoreData 的概念。谢谢!

最佳答案

实现自定义类作为 CoreData 实体的属性。每个类都应被视为单独的实体,数据链接应通过关系进行管理

您必须为标记列表创建新实体,StudentMarkList 将成为您的父实体。

enter image description here

只需将 marklist 的关系添加到 studentMarkList,选择您的 StudentMarkList 实体并创建关系,如图所示。不用担心反向跟随下一步它会很清楚。

enter image description here

现在选择 Marklist 实体并添加如下所示的关系

enter image description here

请确保将类代码生成更改为使用手册

enter image description here

关于具有自定义类类型的 Swift CoreData 保存属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58111175/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com