如何将 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