Coredata fetchrequest 谓词未显示正确的内容
Coredata fetchrequest predicate doesn't show the right things
我是 swift 的新人,我尝试使用 CoreData 制作应用程序,但谓词没有显示正确的结果。程序似乎忽略了谓词,因为没有谓词它显示的是同样的东西。
这是我的代码:
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
}
}
}
}
}
这里是练习应该展示的地方:
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)
}
}
}
}
.. 这里我已经保存了练习:
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
}
}
}
有人知道为什么这不起作用吗?我是 swift 的新手,我尝试了很多东西,但我不明白..
那是因为你似乎没有谓词:
func loadUebungen(){
let request = NSFetchRequest(entityName: "Uebung")
do{
try uebungen = mgdContext.executeFetchRequest(request) as! [Uebung]
}
catch{
print(error)
}
}
你确实有一个谓词的地方与实际填充 table 的代码断开连接,所以你得到一个过滤列表并且在 segue 方法(在以前的视图控制器中)中没有对它做任何事情但随后没有在您实际需要的地方应用谓词(在 loadUebungen
中)。
我是 swift 的新人,我尝试使用 CoreData 制作应用程序,但谓词没有显示正确的结果。程序似乎忽略了谓词,因为没有谓词它显示的是同样的东西。 这是我的代码:
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
}
}
}
}
}
这里是练习应该展示的地方:
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)
}
}
}
}
.. 这里我已经保存了练习:
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
}
}
}
有人知道为什么这不起作用吗?我是 swift 的新手,我尝试了很多东西,但我不明白..
那是因为你似乎没有谓词:
func loadUebungen(){
let request = NSFetchRequest(entityName: "Uebung")
do{
try uebungen = mgdContext.executeFetchRequest(request) as! [Uebung]
}
catch{
print(error)
}
}
你确实有一个谓词的地方与实际填充 table 的代码断开连接,所以你得到一个过滤列表并且在 segue 方法(在以前的视图控制器中)中没有对它做任何事情但随后没有在您实际需要的地方应用谓词(在 loadUebungen
中)。