【问题标题】: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 对象之一?

【问题讨论】:

    标签: ios swift core-data swift3 nsfetchrequest


    【解决方案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,感谢您的回答。但我已经知道了。就像我在问题中所说的那样,我的问题不仅仅是插入。我的问题是将这些对象插入并连接到它们的关系(在这种情况下是现有的人)。
    猜你喜欢
    • 2013-10-18
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多