Key data from one to many relationships in quick

I have been looking for days on how to work with one or more relationships. But I can’t understand.

I am working on an application that stores subject ratings. Thus, one subject has many relationships with ratings. All data is currently stored in an array.

var vakken: [(naam:String, voorkeurGemiddelde:Double, wegingGemiddelde:Double, cijfer:[Double], weging:[Double], gemiddelde:Double)] = []
Where [Double] - Cijfer and weging - are class features.

dataModel

Currently, to save data, I have the following:

 let context = AppDelegate().managedObjectContext

    // Create subject
    let entitySubject = NSEntityDescription.entityForName("Subject", inManagedObjectContext: context)
    let Subject = NSManagedObject(entity: entitySubject!, insertIntoManagedObjectContext: context)

    // Populate subject
    Subject.setValue(vakken.last!.naam, forKey: "name")
    Subject.setValue(vakken.last!.voorkeurGemiddelde, forKey: "voorkeurGemiddelde")
    Subject.setValue(vakken.last!.wegingGemiddelde, forKey: "wegingNP")
    Subject.setValue(vakken.last!.gemiddelde, forKey: "gemiddelde")

    for var j = 0; j < vakken.last!.cijfer.count-1; j++ {

        let Grade = NSEntityDescription.insertNewObjectForEntityForName("Grade", inManagedObjectContext: context)

        Grade.setValue(vakken.last!.cijfer[j], forKey: "cijfer")
        Grade.setValue(vakken.last!.weging[j], forKey: "weging")

        Subject.setValue(NSSet(object: Grade), forKey: "grade")
    }

    do{
        try context.save()
    }catch{
        print("error")
    }

I am using data in a tableView. I saw in some tutorials that using: var vakken = [NSManagedObject]()and then use it in a table.
1. But is it also possible with the model, and should I use it?

, , , , , .

2. appdelegate ?

:

  let fetchRequest = NSFetchRequest(entityName: "Subject")

//        // Add Sort Descriptor
//        let sortDescriptor = NSSortDescriptor(key: "name", ascending: true)               
//        fetchRequest.sortDescriptors = [sortDescriptor]


        let context = Appdelegate().managedObjectContext

        // Execute Fetch Request
        do {
            let result = try context.executeFetchRequest(fetchRequest)
            print(result)
        } catch {
            let fetchError = error as NSError
            print(fetchError)
        }

3. , NSManagedObject, , , .

, A-Z Z-A, , 10-1 1-10. .   4. , .

, . , :

    import UIKit
import CoreData
import Foundation

class Subject: NSManagedObject {
    @NSManaged var gemiddelde: Double
    @NSManaged var name: String
    @NSManaged var voorkeurGemiddelde: Double
    @NSManaged var wegingNP: Double
    @NSManaged var Grades: NSSet
}

class Grade: NSManagedObject {
    @NSManaged var cijfer: Double
    @NSManaged var weging: Double
    @NSManaged var subject: Subject
}

extension Subject {
    func addTagObject(value:Grade) {
        let items = self.mutableSetValueForKey("grade");
        items.addObject(value)
    }

    func removeTagObject(value:Grade) {
        let items = self.mutableSetValueForKey("grade");
        items.removeObject(value)
    }
}

5. , ?

- , , . .

, .:)

Update:

, , .

if let indexPath = self.tableView.indexPathForSelectedRow {
                let object = self.fetchedResultsController.objectAtIndexPath(indexPath)
                let controller = segue.destinationViewController as! VakTableViewController
                controller.vak = object as! Subject

            }

:

 var vak: Subject! {
    didSet {
        // Update the view.
        cijfers = vak.valueForKeyPath("grades.cijfer")!.allObjects as! [Double]
        wegingen = vak.valueForKeyPath("grades.weging")!.allObjects as! [Double]
        self.tableView.reloadData()
    }
}

var cijfers: Array<Double>!
var wegingen: Array<Double>!

6. ?

:

// Override to support editing the table view.
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        if cijfers.count != 1 {
            let entityGrade = NSEntityDescription.entityForName("Grade", inManagedObjectContext: mangedobjectcontext)
            let grade = Grade(entity: entityGrade!, insertIntoManagedObjectContext: mangedobjectcontext)

            grade.cijfer = cijfers[indexPath.row]
            grade.weging = wegingen[indexPath.row]
            vak.removeGradeObject(grade)
            do{
                try mangedobjectcontext.save()
            }catch{
                print("error")
            }
            cijfers.removeAtIndex(indexPath.row)
            wegingen.removeAtIndex(indexPath.row)
            tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
            print(vak.valueForKeyPath("grades.cijfer")?.allObjects)
        }
    }
}

.

7. vak (subject) , ?

: vak.gemiddelde = newgemiddelde

+4
1

:

tableView. , : var vakken = [NSManagedObject](), . , ,

, , , , , NSFetchedResultsController (. Apple Docs). View Core-Data.

, , , , , . appdelegate, ?

/ App Delegate. Apple, CoreData App Delegate; , . . NSManagedObjectContext , :

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let context = appDelegate.managedObjectContext

( , AppDelegate().managedObjectContext, , ). , , , ..

NSManagedObject, , , .

result - NSManagedObjects. valueForKey, "" setValue:(_, forKey:):

let firstObject = result[0]
let firstObjectName = firstObject.valueForKey("name")

:

let firstObjectGrades = firstObject.valueForKey("grades")

: . .

, A-Z Z-A, , 10-1 1-10. . , .

, . a NSSortDescriptor (. Apple Docs) :

let fetchRequest = NSFetchRequest(entityName: "Subject")
fetchRequest.sortDescriptors = [NSSortDescriptor(key:"name", ascending:true)

, . , ?

, . . , , Xcode " NSManagedObject" . Entity . ( , "" ).

, , , , valueForKey setValueForKey:

:

let Subject = NSManagedObject(entity: entitySubject!, insertIntoManagedObjectContext: context)

:

let subject = Subject(entity: entitySubject!, insertIntoManagedObjectContext: context)

( : - ).

Grade.setValue(vakken.last!.cijfer[j], forKey: "cijfer")

:

grade.cijfer = vakken.last!.cijfer[j]

let firstObjectGrades = firstObject.valueForKey("grades")

:

let firstObjectGrades = firstObject.grades

, addTagObject removeTagObject . :

Subject.setValue(NSSet(object: Grade), forKey: "grade")

Subject Grade: . , "-" () :

grade.subject = subject

CoreData ( ) .

?

-, Grades: Grades:

var vak: Subject! {
    didSet {
        // Update the view.
        grades = vak.grades.allObjects as! [Grade]
        self.tableView.reloadData()
    }
}

var grades: Array<Grade>!

, . , cellForRowAtIndexPath - :

let grade = grades[indexPath.row]
let cijfer = grade.cijfer
let weging = grade.weging
// populate cell labels etc using "cijfer" and "waging"

commitEditingStyle , Grade , :

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        let grade = grades[indexPath.row]
        // either remove the Grade from your Subject (which leaves
        // the Grade "orphaned"):
        grade.subject = nil
        // or (probably better) completely delete the grade:
        managedobjectcontext.deleteObject(grade)
        // then remove it from the "grades" array:
        grades.removeAtIndex(indexPath.row)
        // and finally delete the corresponding table view row
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        // wrap up by saving the changes to the context:
        do{
            try mangedobjectcontext.save()
        }catch{
            print("error")
        }
    }
}

vak (subject) , ?

, , , ( ). , , , Subject, save() .

+5

Source: https://habr.com/ru/post/1628572/


All Articles