写入 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 时创建一个新对象的主要内容,如果未能解决你的问题,请参考以下文章