Search code examples
iosswiftcore-datanspredicatensfetchrequest

Coredata fetchrequest predicate doesn't show the right things


I'm new at swift and I try to make an App with CoreData, but the predicate doesn't show me the right results. It seems like the program ignore the predicate, because without the predicate it shows the same things. Here is my Code:

import UIKit

class UebungenAnzeigenTableViewController: UITableViewController {

var mgdContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

var uebungen = [Uebung]()

override func viewDidLoad() {
    super.viewDidLoad()

}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let uvc = segue.destinationViewController as? UebungenAnzeigenViewController {
        if let identifier = segue.identifier{
            switch identifier{
                case "Brust":
                    let request = NSFetchRequest(entityName: "Uebung")

                    request.predicate = NSPredicate(format: "muskel == %@", "Brust")
                    do{
                        try uebungen = mgdContext.executeFetchRequest(request) as! [Uebung]
                    }
                    catch{
                            print("Abfrage fehlgeschlagen!")
                    }
                case "Ruecken":
                    break
                case "Beine":
                    break
                case "Schulter":
                    break
                case "Bizeps":
                    break
                case "Trizeps":
                    break
                case "Nacken":
                    break
                case "Unterarm":
                    break
            default:
                break
            }
        }
    }
}
}

Here is the place where the exercises should be displayed:

import UIKit

class UebungenAnzeigenViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var mgdContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
@IBOutlet weak var tableView: UITableView!

var uebungen = [Uebung](){
    didSet{
        self.tableView.reloadData()
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    loadUebungen()

}


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("UebungCell", forIndexPath: indexPath)
    let uebung = uebungen[indexPath.row]
    cell.textLabel!.text = uebung.name!
    cell.textLabel?.textAlignment = .Center
    return cell
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return uebungen.count
}

func loadUebungen(){
    let request = NSFetchRequest(entityName: "Uebung")
    do{
        try uebungen = mgdContext.executeFetchRequest(request) as! [Uebung]
    }
    catch{
        print(error)
    }

}


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "neueUebung" {
        let ctrl = segue.destinationViewController as! UebungSaveViewController
        ctrl.saveDelegate = {
            (newUebung, newMuskelgruppe) in

            let neueUebung = NSEntityDescription.insertNewObjectForEntityForName("Uebung", inManagedObjectContext: self.mgdContext) as! Uebung
            neueUebung.name = newUebung
            neueUebung.muskel = newMuskelgruppe

            do{
                try self.mgdContext.save()
            }
            catch{
                print("speichern fehlgeschlagen")
            }
            self.loadUebungen()
            self.navigationController?.popViewControllerAnimated(true)
        }
    }
}

}

.. And here I have saved the exercises:

import UIKit

class UebungSaveViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource{

var muskelgruppen = ["Brust", "Rücken", "Beine", "Schultern", "Bizeps", "Trizeps", "Nacken", "Unterarme"]
var saveDelegate: ((String, String) ->())?
var selectedMuskelgruppe = "Brust"

@IBOutlet weak var pickerView: UIPickerView!

@IBOutlet weak var nameTextField: UITextField!

@IBAction func saveUebungAction(sender: UIButton) {
    let neueUebung = nameTextField.text
    if saveDelegate != nil && neueUebung != nil {

        saveDelegate!(neueUebung!, selectedMuskelgruppe)

        }
    }


override func viewDidLoad() {
    super.viewDidLoad()
    self.pickerView.dataSource = self
    self.pickerView.delegate = self
    self.hideKeyboardWhenTappedAround()
}

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return muskelgruppen.count
}

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return muskelgruppen[row]
}

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    switch row{
        case 0:
            selectedMuskelgruppe = "Brust"
        case 1:
            selectedMuskelgruppe = "Rücken"
        case 2:
            selectedMuskelgruppe = "Beine"
        case 3:
            selectedMuskelgruppe = "Schultern"
        case 4:
            selectedMuskelgruppe = "Bizeps"
        case 5:
            selectedMuskelgruppe = "Trizeps"
        case 6:
            selectedMuskelgruppe = "Nacken"
        case 7:
            selectedMuskelgruppe = "Unterarm"
    default:
        break
    }
}
}

Anyone an idea why this doesn't work? I'm new in swift and I tried many things but I don't get it..


Solution

  • That's because you don't appear to have a predicate:

    func loadUebungen(){
        let request = NSFetchRequest(entityName: "Uebung")
        do{
            try uebungen = mgdContext.executeFetchRequest(request) as! [Uebung]
        }
        catch{
            print(error)
        }
    }
    

    Where you do have a predicate is disconnected from the code which actually populates the table, so you're getting a filtered list and doing nothing with it in the segue method (in the previous view controller) but then not applying a predicate where you actually need it (in loadUebungen).