我有一个包含一些表单字段的应用。提交表单时,它会将数据写入我的Core Data Object。但是,当表单再次提交时,它会覆盖现有数据而不是附加到它,这就是我想要发生的事情。
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'常量
出现以下错误Cannot convert value of type 'NSManagedObject' to expected argument type 'NSEntityDescription'
有人可以帮忙吗?
答案 0 :(得分:0)
由于您使用的是NSPersistentContainer
,因此您至少使用了macOS 10.2或iOS 10.10。 Apple已经为Core Data添加了一些非常好的简化,因此没有必要,例如,使用基于字符串的键,这些键的缺点是不能阻止编译器检查。
“新核心数据模式”如下所示:
let managedContext = appDelegate.persistentContainer.viewContext
let newUser = User(context: managedContext)
newUser.title = ...
newUser. firstName = ...
可能就是这么简单。让我知道它是否适合你。
答案 1 :(得分:0)
您需要保留对新创建的用户的引用,然后更新该用户。就像Tom E所建议的那样
let newUser = User(context: managedContext)
newUser.title = ...
newUser. firstName = ...
然后让newUser成为您的类型User或数组的一部分属性[User],具体取决于您的用例
var newUser: User?
当表单更新时,不是创建新用户,而是更新已更改的属性,如
newUser.email = emailField
并调用save以保留更新
try managedContext.save()
答案 2 :(得分:0)
将对象投射到User
:
let newUser = NSEntityDescription.insertNewObject(forEntityName: "User", into: managedContext) as! User
...<fill the fields>
答案 3 :(得分:0)
简单方法:
let newUser = User(entity: User.entity(), insertInto: managedContext)