如何将 NSManagedObject 传递给 NSPredicate 以及如何保存一对多实体
How to pass NSManagedObject to NSPredicate and how to save one-to-many Entities
我有一个简单的 iOS8 Core Data 应用程序,它在 Master Detail 结构中列出了有关患者的信息。 Xcode6.3.1
该应用程序的一部分工作正常 - table 患者视图,在第二个视图控制器中包含每个患者的详细信息。 Core Data 只有两个实体——Patient 和 Note,我设置了一对多的关系。每个Patient可以有很多Notes,但是每个Notes只属于一个Patient。
在患者详细信息页面上,我有一个按钮可以启动第二个 table视图-viewcontroller 对,用于查看属于该患者的注释列表和注释详细信息。
使用 fetchedresultscontroller,数据被正确地填充到 Patient table 视图和 Patient Detail 视图中。但是,我似乎无法将注释与单个患者联系起来。我尝试检索属于单个患者的笔记也没有成功,但我怀疑这是因为我在保存笔记时没有link将笔记编辑到患者对象。
笔记保存码:
func addNewNote() {
makeEntryFieldsEnabledYES()
//the Patient that owns this record is available as self.patientPassedIn
//println("patientPassedIn is: \(patientPassedIn)")
let context = kAppDelegate.managedObjectContext
let entity = NSEntityDescription.entityForName("Note", inManagedObjectContext: kAppDelegate.managedObjectContext!)
var noteToAdd = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: kAppDelegate.managedObjectContext!) as! Note
noteToAdd.setValue(self.titleField.text, forKey: "title")
noteToAdd.setValue(self.noteCategoryField.text, forKey: "noteCategory")
noteToAdd.info = informationView.text
noteToAdd.creationDate = NSDate()
kAppDelegate.saveContext()
performSegueWithIdentifier("unwindToNotesTableViewController", sender: self)
}//addNewNote
我确实将相关的 Patient 对象传递给了 Note 视图控制器,但是我无法 link 将注释传递给
那个对象。
如何构造一个对多实体的保存操作,使得多个 Note 对象只与单个对象相关
病人对象?那么你如何构造获取请求以仅获取属于的Note对象
给定的病人?我想将一个 Patient 对象传递给谓词并检索适当的注释。
笔记获取代码:
var fetchedResultsController: NSFetchedResultsController {
managedObjectContext = kAppDelegate.managedObjectContext
if myFetchedResultsController != nil {
return myFetchedResultsController!
}
let fetchRequest = NSFetchRequest()
// Check this: auto generate didn't work - fix that
let entity = NSEntityDescription.entityForName("Note", inManagedObjectContext: managedObjectContext)
fetchRequest.entity = entity
fetchRequest.fetchBatchSize = 20
let sortDescriptor = NSSortDescriptor(key: "creationDate", ascending: false)
let sortDescriptors = [sortDescriptor]
fetchRequest.sortDescriptors = [sortDescriptor]
//prove that you have passed the Patient object
var testString = passedInPatient?.lastName
println(testString!)
//try this for only retrieving the notes for the given patient
//this does not work
var notePredicate = NSPredicate(format: "passedInPatient")
fetchRequest.predicate = notePredicate
//
//try above
let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
var countError : NSError? = nil
var count = managedObjectContext.countForFetchRequest(fetchRequest, error: &countError)
println("The count is \(count)")
aFetchedResultsController.delegate = self
myFetchedResultsController = aFetchedResultsController
var error: NSError? = nil
if !myFetchedResultsController!.performFetch(&error) {
//create an alert if the fetching fails
println("Unresolved error \(error), \(error!.userInfo)")
abort()
}//if !
return myFetchedResultsController!
}//var fetchedResultsController
我确实将相关的 Patient 对象传递给了 Note 视图控制器,但我无法 link 将注释传递给该对象。
如何为一对多实体构造一个保存操作,以便多个 Note 对象仅与单个 Patient 对象相关?那么如何构造获取请求以仅获取属于给定 Patient 的 Note 对象?我想将一个 Patient 对象传递给谓词并检索适当的注释。
在你的addNewNote
函数中,再添加一行设置关系(设置一对一关系最简单;CoreData会自动为你设置反向关系):
noteToAdd.patient = patientPassedIn
在您的 NSFetchedResultsController
中,谓词所需的格式如下:
var notePredicate = NSPredicate(format: "patient == %@", passedInPatient)
fetchRequest.predicate = notePredicate
我有一个简单的 iOS8 Core Data 应用程序,它在 Master Detail 结构中列出了有关患者的信息。 Xcode6.3.1 该应用程序的一部分工作正常 - table 患者视图,在第二个视图控制器中包含每个患者的详细信息。 Core Data 只有两个实体——Patient 和 Note,我设置了一对多的关系。每个Patient可以有很多Notes,但是每个Notes只属于一个Patient。
在患者详细信息页面上,我有一个按钮可以启动第二个 table视图-viewcontroller 对,用于查看属于该患者的注释列表和注释详细信息。
使用 fetchedresultscontroller,数据被正确地填充到 Patient table 视图和 Patient Detail 视图中。但是,我似乎无法将注释与单个患者联系起来。我尝试检索属于单个患者的笔记也没有成功,但我怀疑这是因为我在保存笔记时没有link将笔记编辑到患者对象。
笔记保存码:
func addNewNote() {
makeEntryFieldsEnabledYES()
//the Patient that owns this record is available as self.patientPassedIn
//println("patientPassedIn is: \(patientPassedIn)")
let context = kAppDelegate.managedObjectContext
let entity = NSEntityDescription.entityForName("Note", inManagedObjectContext: kAppDelegate.managedObjectContext!)
var noteToAdd = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: kAppDelegate.managedObjectContext!) as! Note
noteToAdd.setValue(self.titleField.text, forKey: "title")
noteToAdd.setValue(self.noteCategoryField.text, forKey: "noteCategory")
noteToAdd.info = informationView.text
noteToAdd.creationDate = NSDate()
kAppDelegate.saveContext()
performSegueWithIdentifier("unwindToNotesTableViewController", sender: self)
}//addNewNote
我确实将相关的 Patient 对象传递给了 Note 视图控制器,但是我无法 link 将注释传递给 那个对象。
如何构造一个对多实体的保存操作,使得多个 Note 对象只与单个对象相关 病人对象?那么你如何构造获取请求以仅获取属于的Note对象 给定的病人?我想将一个 Patient 对象传递给谓词并检索适当的注释。
笔记获取代码:
var fetchedResultsController: NSFetchedResultsController {
managedObjectContext = kAppDelegate.managedObjectContext
if myFetchedResultsController != nil {
return myFetchedResultsController!
}
let fetchRequest = NSFetchRequest()
// Check this: auto generate didn't work - fix that
let entity = NSEntityDescription.entityForName("Note", inManagedObjectContext: managedObjectContext)
fetchRequest.entity = entity
fetchRequest.fetchBatchSize = 20
let sortDescriptor = NSSortDescriptor(key: "creationDate", ascending: false)
let sortDescriptors = [sortDescriptor]
fetchRequest.sortDescriptors = [sortDescriptor]
//prove that you have passed the Patient object
var testString = passedInPatient?.lastName
println(testString!)
//try this for only retrieving the notes for the given patient
//this does not work
var notePredicate = NSPredicate(format: "passedInPatient")
fetchRequest.predicate = notePredicate
//
//try above
let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
var countError : NSError? = nil
var count = managedObjectContext.countForFetchRequest(fetchRequest, error: &countError)
println("The count is \(count)")
aFetchedResultsController.delegate = self
myFetchedResultsController = aFetchedResultsController
var error: NSError? = nil
if !myFetchedResultsController!.performFetch(&error) {
//create an alert if the fetching fails
println("Unresolved error \(error), \(error!.userInfo)")
abort()
}//if !
return myFetchedResultsController!
}//var fetchedResultsController
我确实将相关的 Patient 对象传递给了 Note 视图控制器,但我无法 link 将注释传递给该对象。
如何为一对多实体构造一个保存操作,以便多个 Note 对象仅与单个 Patient 对象相关?那么如何构造获取请求以仅获取属于给定 Patient 的 Note 对象?我想将一个 Patient 对象传递给谓词并检索适当的注释。
在你的addNewNote
函数中,再添加一行设置关系(设置一对一关系最简单;CoreData会自动为你设置反向关系):
noteToAdd.patient = patientPassedIn
在您的 NSFetchedResultsController
中,谓词所需的格式如下:
var notePredicate = NSPredicate(format: "patient == %@", passedInPatient)
fetchRequest.predicate = notePredicate