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

时间:2016-12-09 16:42:37

标签: ios swift core-data swift3 nsfetchrequest

我的问题可以应用于任何类型的关系,但在我的情况下,我有 一对多

假设我有一个包含3个对象的实体人员:

布赖恩

彼得

斯科特

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

更具体的问题是:

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

4 个答案:

答案 0 :(得分:5)

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

SWIFT 3

所以 第一步 是让你想要分配多个(在这种情况下是Jobs)的一个对象(在本例中为Person)。这会让你到达那里:

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

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

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

第三步 是通过您提取的人添加对象:

  person[0].addToJobs(job)

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

 for title in jobsTitles {

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

    person[0].addToJobs(job)

 }

答案 1 :(得分:3)

首先:

创建一些工作:

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:编码但未经过测试

答案 2 :(得分:0)

 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)
        }

        }






}

答案 3 :(得分:-1)

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

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

使用它们来设置关系。