• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Today Extension und CoreData

SpecialFighter

Fießers Erstling
Registriert
25.04.12
Beiträge
131
Hallo zusammen,

habe eine iphone app mit ios 8, swift und CoreData. Alles läuft ohne Probleme :)
nun möchte ich eine Today Extension hinzufügen, das ist das erste Mal das ich damit arbeite.
Ich wirklich stolz darauf, sagen zu dürfen, das ich es bereits geschafft habe, in meiner app einen Wert ins NSUserdefault zu schreiben und es in meiner Today Extension anzeigen zu lassen.

Habe im Vorfeld auch schon wie in einigen Tutorials beschrieben, eine AppGroup erstellt und meine App wie auch die Extension darin eingebunden.

Aber jetzt möchte ich einen Schritt weiter gehen und bleine hängen
In meiner App habe ich im CoreData ein Entiny LM_ITEMS

Wie kann ich mir alle Datensätze von LM_ITEMS in meiner Today Extension anzeigen lassen?
In meiner App erfolgt die Ausgabe via:

Code:
let managedObjectContext =(UIApplication.sharedApplication().delegateas!AppDelegate).managedObjectContext
var LM =[LM_ITEMS]()

func DatenAbrufen(){let fetchRequest =NSFetchRequest(entityName:"LM_ITEMS")iflet fetchResults = managedObjectContext!.executeFetchRequest(fetchRequest, error:nil)as?[LM_ITEMS]{
LM = fetchResults
}}


Aber das funktioniert leider in der extension nicht :(
 

SpecialFighter

Fießers Erstling
Registriert
25.04.12
Beiträge
131
diese Anleitung habe ich gemacht. AppGroup eingerichtet und beide Codezeilen ins AppDelagte eingefügt:

Code:
lazy var applicationDocumentsDirectory: NSURL = {
    let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
    return urls[urls.count-1] as NSURL
}()

lazy var applicationDocumentsDirectory: NSURL? = {
    lazy var applicationDocumentsDirectory: NSURL? = {
    return NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.com.yourdomain.YourAwesomeGroup") ?? nil
}()
 

Buhmi

Osnabrücker Reinette
Registriert
21.11.09
Beiträge
977
Dann ändere mal folgenden Teil:

Code:
func DatenAbrufen(){
  let fetchRequest =NSFetchRequest(entityName: "LM_ITEMS" )
  if let fetchResults = managedObjectContext!.executeFetchRequest(fetchRequest, error:nil) as? [LM_ITEMS] {
    LM = fetchResults
  }
}

in

Code:
func DatenAbrufen(){
  let fetchRequest =NSFetchRequest(entityName: "LM_ITEMS" )
 
  var error:NSError?
  let fetchResults = managedObjectContext!.executeFetchRequest(fetchRequest, error:error) as? [LM_ITEMS]
 
  if error !=nil {
    println("Error executing request for entity \(entity)")
  }
}

Alternativ zum error != nil Part kannst du auch einfach einen Breakpoint nach dem Ausführen des FetchRequests setzen und prüfen, was im error Objekt steht. Dann siehst du zumindest, woran der FetchRequest scheiterst.
 
Zuletzt bearbeitet:

SpecialFighter

Fießers Erstling
Registriert
25.04.12
Beiträge
131
was ändert sich dadurch denn?
die func DatenAbrufen befindet sich ja in meiner App (nicht in der Extension) und mein App Code aus Post 1 klappt ja.
 

Buhmi

Osnabrücker Reinette
Registriert
21.11.09
Beiträge
977
Oh, hatte vergessen den error in executeFetchRequest zu übergeben. Ziel ist einfach statt nil ein Error-Objekt beim Ausführen des FetchRequests zu übergeben. Auftretende Fehler, die das leere fetchResult verursachen, werden in diesem Objekt gespeichert. Das kannst du auslesen und wirst daraus schlauer :) Ähnlichen Code muss es ja auch in der Extension geben, dann müsstest du da auch ein Error-Objekt übergeben.

Edit: Oder habe ich das falsch verstanden und es scheitert an viel grundlegenderen Dingen?
 

SpecialFighter

Fießers Erstling
Registriert
25.04.12
Beiträge
131
ja ich glaube du hast es missverstanden.
DIe Abfrage der Daten klappt aus meiner App ohne Probleme - alles Perfekt.
Nur klappt die Abfrage der Daten aus der Today Extension nicht, da ich den selben Code, wie ich ihn in der App verwende nicht nutzen kann.

Wenn ich diesen Code für die Abfrage in der Extension nutze:
Code:
let managedObjectContext =(UIApplication.sharedApplication().delegateas!AppDelegate).managedObjectContext
var LM =[LM_ITEMS]()

func DatenAbrufen(){let fetchRequest =NSFetchRequest(entityName:"LM_ITEMS")iflet fetchResults = managedObjectContext!.executeFetchRequest(fetchRequest, error:nil)as?[LM_ITEMS]{
LM = fetchResults
}}

Dann erhalte ich schon folgenden Fehler:
Use of undeclared type 'AppDelegate'
TodayViewController' does not have a member named 'managedObjectContext'
 

Buhmi

Osnabrücker Reinette
Registriert
21.11.09
Beiträge
977
Dann hast du die Anleitung von oben allerdings erst zur Hälfte bearbeitet. Du musst das gesamte Einrichten deines CoreData Stacks im AppDelegate der App nochmal im AppDelegate der WatchApp wiederholen. Das Tutorial überlässt das allerdings dem User ;) Du kannst jetzt entweder die Zeilen kopieren oder die Einrichtung so in eigene Datei auslagern, dass sowohl die echte App, als auch die Watch Extension den Code benutzen können.
 

SpecialFighter

Fießers Erstling
Registriert
25.04.12
Beiträge
131
und genau daran scheitere ich.
Erstens, sehe ich kein AppDelege der TodayExtension:
Bildschirmfoto 2015-08-13 um 09.18.49.png


Und zweitens würde ich gerne eine Zentrale CoreData Datei anlegen, worauf die App und die Extension drauf zugreift.
Und wie das geht, beschreibt das Tutorial leider nicht mehr :/
 

SpecialFighter

Fießers Erstling
Registriert
25.04.12
Beiträge
131
habe jetzt noch etwas experimentiert.
habe jetzt eine CoreDataDelegate.swfit für die TodayExtension angelegt mit den Codezeilen for CoreData.
und im TodayViewController den Code für die Datenabfrage.

Allerdings hängt sich der Simulator bei folgender Codezeile im ViewController auf:
Code:
let managedObjectContext = (UIApplication().delegate as! CoreDataDelegate).managedObjectContext

Fehlermeldung:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'There can only be one UIApplication instance.'

Wie kann ich dieses problem lösen?