我有一个[User]类型的数组,我想将它保存在Core Data中,然后在Table View中显示它。以下是我保存和检索数据的功能:
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中?
答案 0 :(得分:5)
您只创建一个用户实体,然后每次只写它。问题是,在循环访问用户数组之前,您将创建一个新实体。 您应该为阵列中的每个用户执行此操作。这是一个非常简单的修复,只需交换两行。请参阅下面的正确代码:
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)")
}
}