gpt4 book ai didi

arrays - 结构数组 : How to save in coredata?

转载 作者:搜寻专家 更新时间:2023-11-01 05:56:04 26 4
gpt4 key购买 nike

我正在尝试将结构数组保存到核心数据中。我做了很多研究,但找不到解决方案。这是我得到的:

import Cocoa
import CoreData

class ViewController: NSViewController {

struct StudentsStruct {
let firstName: String
let lastName: String
let age: Int
}


let Studentsdata: [StudentsStruct] = [StudentsStruct(firstName: "Albert", lastName: "Miller", age: 24), StudentsStruct(firstName: "Susan", lastName: "Gordon", age: 24), StudentsStruct(firstName: "Henry", lastName: "Colbert", age: 24)]


override func viewDidLoad() {
super.viewDidLoad()

let student: Student = NSEntityDescription.insertNewObject(forEntityName: "Student", into: DatabaseController.getContext()) as! Student


for items in Studentsdata {
student.firstName = StudentsStruct.firstName
student.lastName = StudentsStruct.lastName
student.age = StudentsStruct.age
}

DatabaseController.saveContext()
let fetchRequest: NSFetchRequest<Student> = Student.fetchRequest()

print (student)
}
}

DatabaseController 是我从本教程中获得的解决方案: https://www.youtube.com/watch?v=da6W7wDh0Dw它不是那么重要,它只是制作“getContext”功能。重要的是,在命令行“student.firstName = StudentsStruct.firstName”中,我收到错误“实例成员”firstName“不能用于 ViewController.StudentStruct 类型。在尝试和尝试之后,我想不出如何将结构数组放入核心数据中。

这是数据库 Controller 文件:

import Foundation
import CoreData


class DatabaseController {

private init() {
}
class func getContext() -> NSManagedObjectContext {
return DatabaseController.persistentContainer.viewContext
}

// MARK: - Core Data stack

static var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "StudentCoreFile")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error {
fatalError("Unresolved error \(error)")
}
})
return container
}()

class func saveContext () {
let context = DatabaseController.persistentContainer.viewContext
if context.hasChanges {
do {
try context.save()
} catch {
// Replace this implementation with code to handle the error appropriately.
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
}

}

提前感谢任何帮助!

好的,你是对的,我忘了执行fetchrequest。这是我当前的代码:

import Cocoa
import CoreData

class ViewController: NSViewController {

struct StudentsStruct {
let firstName: String
let lastName: String
let age: Int
}


let Studentsdata: [StudentsStruct] = [StudentsStruct(firstName: "Albert", lastName: "Miller", age: 24), StudentsStruct(firstName: "Susan", lastName: "Gordon", age: 24), StudentsStruct(firstName: "Henry", lastName: "Colbert", age: 24)]


override func viewDidLoad() {
super.viewDidLoad()

let student: Student = NSEntityDescription.insertNewObject(forEntityName: "Student", into: DatabaseController.getContext()) as! Student


for item in Studentsdata {
let student: Student = NSEntityDescription.insertNewObject(forEntityName: "Student", into: DatabaseController.getContext()) as! Student
student.firstName = item.firstName
student.lastName = item.lastName
student.age = Int16(item.age)
}
DatabaseController.saveContext()
let fetchRequest: NSFetchRequest<Student> = Student.fetchRequest()

do {
let searchResults = try DatabaseController.getContext().fetch(fetchRequest)
print("number of results: \(searchResults.count)")
for result in searchResults as [Student] {
print(student)
}

} catch {

print ("error")

}

}
}

它运行没有错误。现在我得到 32 个搜索结果。每个条目是:年龄= 0;名字=零;姓氏 = 无;

为了比较,没有循环的这段代码是有效的:

import Cocoa
import CoreData

class ViewController: NSViewController {

override func viewDidLoad() {
super.viewDidLoad()

let student: Student = NSEntityDescription.insertNewObject(forEntityName: "Student", into: DatabaseController.getContext()) as! Student

student.firstName = "henry"
student.lastName = "miller"
student.age = 22

DatabaseController.saveContext()
let fetchRequest: NSFetchRequest<Student> = Student.fetchRequest()

do {
let searchResults = try DatabaseController.getContext().fetch(fetchRequest)
print("number of results: \(searchResults.count)")
for result in searchResults as [Student] {
print(student)
}
} catch {

print ("error")
}

}

}

最佳答案

您需要访问 item在您的 for 循环中,您当前正在访问同一对象 Student for 循环中的对象而不是你需要创建一个新的 Student在 for 循环的每次迭代中。

for item in Studentsdata {
//Create new student in for loop
let student = NSEntityDescription.insertNewObject(forEntityName: "Student", into: DatabaseController.getContext()) as! Student
//To get firstName, lastName and age access the item
student.firstName = item.firstName
student.lastName = item.lastName
student.age = item.age
}
//Save context now
DatabaseController.saveContext()

关于arrays - 结构数组 : How to save in coredata?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44544387/

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