我的问题可以应用于任何类型的关系,但在我的情况下,我有 一对多 。
假设我有一个包含3个对象的实体人员:
布赖恩
彼得
斯科特
每个人都可以有很多工作。所以我有一个当前为空的Job实体。两个实体的反向关系已经创建,并且效果很好。为了清楚我的问题是没有插入一个对象(我知道该怎么做),是具体的插入方式。
更具体的问题是:
如何将一个或多个作业对象插入作业实体并将其中的每一个分配给Core Data中当前存在的一个Person对象?
答案 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;
使用它们来设置关系。