将一组对象保存到Core Data

时间:2018-03-09 14:21:35

标签: ios swift uitableview core-data

我有一个[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中?

1 个答案:

答案 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)")
    }
}