将对象数组保存到核心数据

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中?

Jac*_*ing 7

您仅创建一个用户实体,然后每次都覆盖它。问题在于,在遍历用户数组之前,您要创建一个新实体。您应该对阵列中的每个用户执行此操作。这很简单,只需交换两行即可。参见下面的正确代码:

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)