gpt4 book ai didi

ios - 将对象数组保存到 Core Data

转载 作者:搜寻专家 更新时间:2023-11-01 06:01:23 25 4
gpt4 key购买 nike

我有一个 [User] 类型的数组,我想将它保存在核心数据中,稍后在 TableView 中显示它。以下是我用于保存和检索数据的函数:

func saveUserData(_ users: [User]) {
let context = appDelegate.persistentContainer.viewContext
let newUser = NSEntityDescription.insertNewObject(forEntityName: "Users", into: context)
for user in users {
newUser.setValue(user.id, forKey: "id")
newUser.setValue(user.name, forKey: "name")
newUser.setValue(user.email, forKey: "email")
newUser.setValue(user.phone, forKey: "phone")
newUser.setValue(user.website, forKey: "website")
newUser.setValue(user.city, forKey: "city")
newUser.setValue(user.lat, forKey: "lat")
newUser.setValue(user.long, forKey: "long")
}
do {
try context.save()
print("Success")
} catch {
print("Error saving: \(error)")
}
}

func retrieveSavedUsers() -> [User]? {
let context = appDelegate.persistentContainer.viewContext
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")
request.returnsObjectsAsFaults = false
var retrievedUsers: [User] = []
do {
let results = try context.fetch(request)
if !results.isEmpty {
for result in results as! [NSManagedObject] {
guard let id = result.value(forKey: "id") as? Int else { return nil }
guard let name = result.value(forKey: "name") as? String else { return nil }
guard let email = result.value(forKey: "email") as? String else { return nil }
guard let phone = result.value(forKey: "phone") as? String else { return nil }
guard let website = result.value(forKey: "website") as? String else { return nil }
guard let city = result.value(forKey: "city") as? String else { return nil }
guard let lat = result.value(forKey: "lat") as? String else { return nil }
guard let long = result.value(forKey: "long") as? String else { return nil }
let user = User(with: id, name: name, email: email, phone: phone, website: website, city: city, lat: lat, long: long)
retrievedUsers.append(user)
}
}
} catch {
print("Error retrieving: \(error)")
}
return retrievedUsers
}

检索工作正常,但问题是它只保存了 Core Data 中最后一个 User 类型的对象。似乎当我在保存用户时迭代槽时,每次迭代都会覆盖用户对象而不是保存一个新对象。知道如何解决这个问题,或者是否有更好的方法将自定义对象数组保存到 Core Data 中?

最佳答案

您只是创建一个用户实体,然后每次都覆盖它。问题是就在您循环遍历用户数组之前,您创建了一个新实体。 您应该为数组中的每个用户执行此操作。这是一个非常简单的修复方法,只需交换两行即可。请参阅下面的正确代码:

func saveUserData(_ users: [User]) {
let context = appDelegate.persistentContainer.viewContext
for user in users {
let newUser = NSEntityDescription.insertNewObject(forEntityName: "Users", into: context)
newUser.setValue(user.id, forKey: "id")
newUser.setValue(user.name, forKey: "name")
newUser.setValue(user.email, forKey: "email")
newUser.setValue(user.phone, forKey: "phone")
newUser.setValue(user.website, forKey: "website")
newUser.setValue(user.city, forKey: "city")
newUser.setValue(user.lat, forKey: "lat")
newUser.setValue(user.long, forKey: "long")
}
do {
try context.save()
print("Success")
} catch {
print("Error saving: \(error)")
}
}

关于ios - 将对象数组保存到 Core Data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49195800/

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