Я новичок в использовании CoreData в качестве базы данных для хранения данных пользователей для поддержки автономного использования приложений.Я настроил модель данных для своих объектов, и некоторые атрибуты должны быть сохранены в типе других моих классов объектов.Тем не менее, он, кажется, успешно сохранен, но возвращает nil
, когда я пытался получить результаты из базы данных.Я также заглянул в файл базы данных SQLite, чтобы увидеть, что случилось с полем, которое было сохранено в CoreData, и дало мне nil
в качестве результатов (а возвращаемый тип был найден Optional(Any)
), и обнаружил, что атрибут данных былхранится в типе BLOB
.
Результаты хранятся в SQLite:
Первоначально мое приложение можно было использовать толькокогда сеть доступна, но я пытаюсь включить поддержку автономного доступа.Тем не менее, я придерживаюсь проблем и не знаю, как их решить, и даже я не уверен, правильно ли я поступил.
Один из примеров моих пользовательских классов объектов 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
:
Соответствующий класс пользовательских объектов 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
:
Функция save()
используется для сохранения экземпляра в CoreData в качестве соответствующегокласс объекта.
Надеюсь, кто-нибудь может мне помочь или разъяснить мне концепции использования CoreData.Спасибо!