如何将新对象插入实体并设置该对象与另一个实体的现有对象的关系?

Posted

技术标签:

【中文标题】如何将新对象插入实体并设置该对象与另一个实体的现有对象的关系?【英文标题】:How to insert a new Object into an Entity and set the relationship of that object with an existing object of another entity? 【发布时间】:2016-12-09 16:42:37 【问题描述】:

我的问题可以应用于任何类型的关系,但就我而言,我有一个一对多

假设我有一个实体人,它有 3 个对象:

布赖恩

彼得

斯科特

每个人都可以有很多工作。所以我有一个当前为空的 Job 实体。两个实体的反向关系已经创建并且它们工作得很好。只是要清楚我的问题是没有插入对象(我知道怎么做),是插入的具体方式。

所以更具体的问题是:

如何将一个或多个作业对象插入作业实体,并将它们中的每一个分配给当前存在于 Core Data 中的 Person 对象之一?

【问题讨论】:

【参考方案1】:

在尝试了很多事情之后,我终于找到了解决方案。感谢 Jimmy,他对如何解决这个问题提出了一个想法。关键是要意识到您不能将许多对象分配给已经存在的对象(或者至少我找不到方法),但是您可以将许多对象添加到现有对象中。换句话说,您不能将实体分配给 Set,也不能反过来。

SWIFT 3

所以第一步是获取一个你想要分配很多(在这种情况下是工作)的对象(在这种情况下是人)。这会让你到达那里:

  var person = try MOC.fetch(Person.fetchRequest()).filter  $0.name == "Brian" 

第二步是创建 Jobs 的托管对象:

 let job = Jobs(context: MOC)
 job.title = "Computers"

第三步是通过您获取的 Person 添加对象:

  person[0].addToJobs(job)

如果您想添加多个作业,那么您可以创建一个 for 循环并创建任意数量的托管对象,并在它们准备好保存时添加它们。例如:

 for title in jobsTitles 

    let job = Jobs(context: MOC)
    job.title = title

    person[0].addToJobs(job)

 

【讨论】:

很高兴听到您找到了解决方案!不要忘记投票给我的答案,帮助人们是未来! 我会给你一票,但我不能,因为我需要超过 15 点声望,而我只有 13 点。【参考方案2】:

第一:

创造一些工作:

let job1 = NSEntityDescription.insertNewObjectForEntityForName("Job", inManagedObjectContext: managedObjectContext) as! Job
...

第二:

检索那些工作:

// Request
let moc = managedObjectContext
let jobFetch = NSFetchRequest(entityName: "Job")
// Filtring
let jobTitle1 = "job1"
jobFetch.predicate = NSPredicate(format: "jobTitle == %@", jobTitle)
do 
    let fetchedJobs = try moc.executeFetchRequest(jobFetch) as! [Job] // JOBS
 catch 
    fatalError("Failed to fetch jobs: \(error)")

第三:

检索人:

// Request
let moc = managedObjectContext
let personFetch = NSFetchRequest(entityName: "Person")
// Filtring
let firstName = "Person1"
personFetch.predicate = NSPredicate(format: "firstname == %@", firstName)
do 
    let fetchedJobs = try moc.executeFetchRequest(personFetch) as! [Person] // PERSONS
 catch 
    fatalError("Failed to fetch persons: \(error)")

第四:

向人员断言工作:

let person1 = (personFetch as! [Person])[0]
let job1 = (fetchedJobs as! [Job])[0]
person1.job = job1

PS:已编码但未测试

【讨论】:

嗨,吉米,感谢您的回答。这段代码看起来应该带我走上正确的道路。我将继续测试它并确保它有效,并让你知道它是否有效。再次感谢 嗨,Jimmy,从我目前测试的结果来看,由于这行代码,此代码将无法工作:person1.job = job1。作业 1 是一个集合,您不能将集合类型分配给实体类型【参考方案3】:
 let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
func fetchData()

    do
    
    task1 = try context.fetch(Contact.fetchRequest())


    
catch

print("Error fetching data from CoreData")




func filtering()


    do 
        let contactIdentifier : String = searchVariable.text!
        let formatRequest : NSFetchRequest<Contact> = Contact.fetchRequest()
        formatRequest.predicate = NSPredicate(format: "first_name CONTAINS[c] '\(contactIdentifier)'")
        let fetchedResults = try context.fetch(formatRequest)
        if let aContact = fetchedResults.first
        
            searchResult = fetchedResults

        
        contactListngTable.reloadData()
    
    catch 
        print ("fetch task failed", error)
    




@IBAction func saveButton(_ sender: Any)

    let task = Contact(context:context)
    task.first_name = firstNameTextbox.text
    task.last_name = lastNameTextbox.text
    task.phone_number = phoneNumberTextbox.text
    (UIApplication.shared.delegate as! AppDelegate).saveContext()
    _ = navigationController?.popViewController(animated: true)     


@IBAction func loguotButton(_ sender: Any)

    let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let newViewController = storyBoard.instantiateViewController(withIdentifier: "logout") as! ViewController
    self.present(newViewController, animated: true, completion: nil)



func authinication()

    let username : String = usernameTextbox.text!
    let pasword : String = passwordTextbox.text!
    let parameter : Parameters = ["email": "\(username)" , "password": "\(pasword)" ]

    Alamofire.request("https://reqres.in/api/login", method:.post, parameters:parameter
        ).responseJSON  response in
        switch response.result 
        case .success(let value):
            //print(response)
            let forToken = JSON(value)
            let token = forToken["token"]
            let error = forToken["error"]
            if(token.type == SwiftyJSON.Type.null)
            
                self.errorMessageLabel.text = error[].stringValue
            
            else
            
                self.performSegue(withIdentifier: "loginSuccess", sender: nil)
            




        case .failure(let error):
            print(error)
        

        







【讨论】:

虽然此代码 sn-p 可能是解决方案,但包含解释确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因【参考方案4】:

如果您使用的是 CoreData,那么您的对象已生成类。在这个生成的类中,您将看到生成的方法如下:

- (void)addJobsObject:(CDJob*)value;
- (void)removeJobsObject:(CDAdvert*)value;
- (void)addJobs:(NSSet*)values;

使用它们来设置关系。

【讨论】:

您好 Adamsor,感谢您的回答。但我已经知道了。就像我在问题中所说的那样,我的问题不仅仅是插入。我的问题是将这些对象插入并连接到它们的关系(在这种情况下是现有的人)。

以上是关于如何将新对象插入实体并设置该对象与另一个实体的现有对象的关系?的主要内容,如果未能解决你的问题,请参考以下文章

Core Data + iCloud,更改通知插入和删除关系中的对象但不更新关系中现有实体的属性

如何阻止实体框架尝试保存/插入子对象?

如何初始化与另一个实体具有一对一关系的新对象,然后将该新对象添加到数据库中?

如何创建从一个实体到另一个现有实体的核心数据关系?

如何检查字符串中的字符并在插入之前替换该字符

带有嵌套对象的实体框架数据插入,该对象具有一个请求的自动递增主键