写入Core Data时创建新对象

时间:2018-04-13 11:08:16

标签: ios swift core-data

我有一个包含一些表单字段的应用。提交表单时,它会将数据写入我的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'

有人可以帮忙吗?

4 个答案:

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