写入 Core Data 时创建一个新对象

Posted

技术标签:

【中文标题】写入 Core Data 时创建一个新对象【英文标题】:Creating a new object when writing to Core Data 【发布时间】:2018-04-13 11:08:15 【问题描述】:

我有一个包含一些表单字段的应用程序。提交表单后,它会将数据写入我的核心数据对象。但是,当再次提交表单时,它会覆盖现有数据而不是附加到它,而这正是我想要发生的。

    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else 
        return
    

    let managedContext = appDelegate.persistentContainer.viewContext
    let userEntity = NSEntityDescription.entity(forEntityName: "User", in: managedContext)

    let newUser = NSManagedObject(entity: userEntity! , insertInto: managedContext)
    newUser.setValue(titleField, forKey: "title")
    newUser.setValue(firstNameField, forKey: "firstName")
    newUser.setValue(lastNameField, forKey: "lastName")
    newUser.setValue(emailField, forKey: "email")
    newUser.setValue(affiliatedOrgField, forKey: "affiliatedOrg")
    newUser.setValue(ukRegionField, forKey: "ukRegion")
    newUser.setValue(privacyChecked, forKey: "privacyPolicy")

    do 
        try managedContext.save()
     catch let error as NSError 
        print("Could not save. \(error), \(error.userInfo)")
    

我尝试过使用

let userEntity = NSEntityDescription.insertNewObject(forEntityName: "User", into: managedContext)
let newUser = NSManagedObject(entity: userEntity, insertInto: managedContext)

但我的“newUser”常量出现以下错误

无法将“NSManagedObject”类型的值转换为预期的参数类型“NSEntityDescription”

有人可以帮忙吗?

【问题讨论】:

为此,您必须使用 sqlite db。 @MaulikPatel 该评论毫无意义。对于这个问题,代码每次执行时都会创建一个新对象,并且根本不查找现有对象,因此很难判断您的问题将如何发生。您可能对其中一个字段有唯一性约束吗?也许是电子邮件地址字段? 你不需要最后一行代码。你只需要let userEntity = NSEntityDescription.insertNewObject(forEntityName: "User", into: managedContext) as! User 【参考方案1】:

您需要保留对新创建用户的引用,然后更新该用户。按照 Tom E 的建议去做

let newUser = User(context: managedContext)
newUser.title = ...
newUser. firstName = ...

然后让 newUser 成为用户类型的类中的一个属性或数组的一部分 [User],具体取决于您的用例

var newUser: User?

当表单更新时,不要创建新用户,而是更新更改的属性,例如

newUser.email = emailField

并调用 save 以保持更新

try managedContext.save()

【讨论】:

【参考方案2】:

由于您使用的是NSPersistentContainer,因此您至少使用的是 macOS 10.12 或 ios 10.10。 Apple 为 Core Data 添加了一些非常好的简化,因此不必使用基于字符串的键,这些键具有抵抗编译器检查的缺点。

“新核心数据模式”如下所示:

let managedContext = appDelegate.persistentContainer.viewContext
let newUser = User(context: managedContext)
newUser.title = ...
newUser.firstName = ...

可能就这么简单。让我知道它是否适合你。

【讨论】:

【参考方案3】:

将对象投射到User

let newUser = NSEntityDescription.insertNewObject(forEntityName: "User", into: managedContext) as! User
...<fill the fields>

【讨论】:

【参考方案4】:

简单的方法:

let newUser = User(entity: User.entity(), insertInto: managedContext)

【讨论】:

以上是关于写入 Core Data 时创建一个新对象的主要内容,如果未能解决你的问题,请参考以下文章

C++ 以前的记录在写入新对象时被删除

如何写入新的文件对象[重复]

在 Core Data 中插入一个新的托管对象

在 Node.js 中写入文件时创建目录

防止 Core Data 创建空对象

当用户滚动 MKMapView 时,从 Core Data 加载其他对象