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

标签 ios swift uitableview core-data

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

相关文章:

ios - 在 ScrollView 中放置 View 和元素

ios - 根据所选选项,在不同的 View Controller 中使用相同的文本字段数据进行计算

Swift 为什么从 Parse 检索数据时我必须按两次按钮才能在 tableview 中加载数据

ios - 自动调整 uitableviewcell 的大小 - SWIFT

ios - 按下 View Controller 后,右导航栏按钮项目消失

ios - 什么功能可以帮助我了解用户在文本字段中输入的第一个字符以及当我按下键盘返回时如何制作一个空行?

ios - 在 Xcode Swift 中显示空白/白色 View 的弹出窗口演示文稿

ios - 点击标签栏滚动到 UITableViewController 的顶部并不总是有效

ios - 在 Interface Builder 中使用自定义字体设计标签/ TextView

ios - Dynamo DB iOS dynamoDBObjectMapper存储双倍