MHC*_*Csk 1 core-data uitableview ios swift
我有一个[User]类型的数组,我想将其保存在Core Data中,然后在表视图中显示它。这是我保存和检索数据的功能:
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
}
Run Code Online (Sandbox Code Playgroud)
检索工作正常,但问题是它仅将用户类型的最后一个对象保存在Core Data中。似乎当我在保存用户时遍历低谷的用户时,每次迭代都会覆盖用户对象,而不是保存一个新的对象。知道如何解决此问题,还是有更好的方法将自定义对象数组保存到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)")
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1446 次 |
| 最近记录: |