2016-05-22 6 views
-1

So bin ich neu zu Kerndaten, beginnend mit einigen Tutorials und bekam eine sehr einfache Einrichtung, wo eine 10 Punkte von der AppDelegate gespeichert werden und das funktioniert gut (kann von der Konsole abrufen und drucken).Wie fatalen Fehler zu verhindern: unerwartet gefunden nil wile Unwrapping ein optionaler Wert

Wenn ich eine fetchrequest in einer anderen VC verwenden möchte, um die erfolgreich gespeicherten Daten abzurufen, erhalte ich den folgenden Fehler: Schwerwiegender Fehler: unerwartet gefunden Null beim Entpacken eines optionalen Werts. Hier ist der Code, um die Daten abzurufen:

import Foundation 
import CoreData 
import UIKit 


class testVC: UIViewController { 
var managedObjectContext: NSManagedObjectContext! 
var scores = [Scores]() 

@IBOutlet weak var retrieveDataLabel: UIButton! 
@IBOutlet weak var saveLabel: UIButton! 
    override func viewDidLoad() { 
    super.viewDidLoad() 

    } 


@IBAction func retrieveData(sender: AnyObject) { 
    let fetchRequest = NSFetchRequest(entityName: "Scores") 
    do { 
     if let results = try managedObjectContext.executeFetchRequest(fetchRequest) as? [Scores]{ 
      scores = results 
      for result in results { 
       if let gameScore = result.valueForKey("gameScore") as? Int{ 
        print("Your score is \(gameScore)") 
       } 
      } 
     } 
    }catch{ 
     print("Error fetching data") 
    }} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

}

Da ich verwende, wenn lassen .. soll ich werden nicht immer „Error Abrufen von Daten“? anstatt den fatalen Fehler zu bekommen? Wie kann ich die Daten beim Laden der App abrufen, aber nicht, wenn ich versuche, die Daten in einer anderen VC mit demselben Code abzurufen?

Ich habe bei anderen Fragen sehe zu fatalen Fehlern im Zusammenhang gefunden, während nil einen optionalen Wert auspackt: What does "fatal error: unexpectedly found nil while unwrapping an Optional value" mean?

fatal error: unexpectedly found nil while unwrapping an Optional value und es scheint, dass ich im Grunde bin versucht, etwas zu holen, die nicht da ist, aber Die Daten werden in der Tat gespeichert und ich kann sie in der Konsole abrufen, wenn ich die App starte. Mit der gleichen Abrufanforderung würde ich erwarten, identische Ergebnisse zu erhalten, wenn ich die App lade und die Daten abrufe, aber das ist nicht der Fall.

Was fehlt mir hier? Es fühlt sich an, als sollte es sehr einfach sein, aber aus irgendeinem Grund kann es einfach nicht funktionieren, nachdem ich es 2 Tage lang versucht habe.

AppDelegate Code zu speichern und Abrufen von Daten:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    // Override point for customization after application launch. 
    //addTestData() 
    let fetchRequest = NSFetchRequest(entityName: "Scores") 
    do { 
     if let results = try managedObjectContext.executeFetchRequest(fetchRequest) as? [NSManagedObject]{ 
      for result in results { 
       if let gameScore = result.valueForKey("gameScore") as? Int{ 
        print("Your score is \(gameScore)") 
       } 
      } 
     } 
    }catch{ 
     print("Error fetching data") 
    } 

    return true 
} 
func addTestData(){ 

    guard let entity = NSEntityDescription.entityForName("Scores", inManagedObjectContext: managedObjectContext) else{ 
     fatalError("Could not find entity description") 
    } 
    for i in 1...10{ 
     let score = Scores(entity: entity, insertIntoManagedObjectContext: managedObjectContext) 
     score.gameScore = i 
    } 
    do { 
     try managedObjectContext.save() 
    } catch { 
     // Replace this implementation with code to handle the error appropriately. 
     // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     let nserror = error as NSError 
     NSLog("Unresolved error \(nserror), \(nserror.userInfo)") 
     abort() 
    } 

} 

Jede Hilfe wäre sehr dankbar!

Antwort

0

Das Problem ist die nilNSManagedObjectContext (deklarierte, aber kein Wert)

Per Definition executeFetchRequest gibt eine nicht-optionalen Array auf Erfolg und da Sie sollen aus dem Kerndatenmodell wissen, dass das Unternehmen Scores kehrt immer Scores Objekte, die Sie sicher

do { 
    scores = try managedObjectContext.executeFetchRequest(fetchRequest) as! [Scores] 

Und natürlich mit einer NSManagedObject Unterklasse direkt die Eigenschaft verwenden, um die Art Gießen zu vermeiden schreiben können. Sie benötigen die optionale Bindung nur, wenn die Eigenschaft gameScore als optional deklariert ist.

for result in results { 
     if let gameScore = result.gameScore { 
      print("Your score is \(gameScore)") 
     } 

jedoch für einen Int Wert wie eine Partitur eines nicht-optional ist vernünftiger, als Sie den Code zu

for result in results { 
     print("Your score is \(result.gameScore)") 
    } 
+0

@ vadian Danke! – ThirtyKnots

1

Wenn Sie if let verwenden, prüfen Sie, ob es möglich ist, das Ergebnis als Int. Sie möchten sehen, ob das Ergebnis zuerst existiert. Versuchen Sie folgendes:

for result in results { 
      if let gameScore = result.valueForKey("gameScore") { 
       print("Your score is \(gameScore as! Int)") 
      } 
     } 
+0

Die folgenden Code gibt den Fehler zu reduzieren: wenn die Ergebnisse lassen ... so Es stürzt ab, bevor es das Ergebnis vom Fetch erreicht, aber mit diesem Fehler: fataler Fehler: unerwartet gefunden Null beim Entpacken ein optionaler Wert und nicht das Folgende: print ("Fehler beim Abrufen von Daten") – ThirtyKnots

+0

Versuchen Sie, die Do und fangen. Du brauchst es nicht. Es könnte helfen, wenn Sie es entfernen – penatheboss

0

So habe ich es schaffe, um es arbeiten, mit dem folgenden für managedObjectContext. lassen managedContext = AppDelegate() managedObjectContext

Ich bin immer noch verwirrt, warum ich nicht bekommen die Fehler, der im Catch angegeben wurde, aber zumindest funktioniert es jetzt.

Vielen Dank für Ihre Antworten!

Verwandte Themen