2016-07-23 24 views
1

Ich versuche, Core-Datenattribute in der heutigen Widget-Erweiterung zu lesen. Ich habe viele Websites und Fragen hier gesucht, aber ich konnte keine Lösung finden! Bisher habe ich App-Gruppe zu meiner app und dann diese Zeile ändern in App Delegate:Zugriff auf Core-Daten von Widget-Erweiterung

lazy var applicationDocumentsDirectory: NSURL = { 
    // file. This code uses a directory named "compony.AppName" in the application's documents Application Support directory. 
    let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) 
    return urls[urls.count-1] 
}() 

zu:

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

so was ist der nächste Schritt? Wie kann ich vom Widget-Center aus auf Context-Entity und etc ... zugreifen? Ich wäre dankbar, wenn ein Körper mir helfen würde.

Ich habe nur eine entity mit mehreren attributes.

EDIT

  • erstelle ich eine CoreDataStack.swift und kopiert alle Daten Core-Dateien von AppDelegate auf neue Datei.

  • hinzugefügt meine Datenmodell Erweiterung widget:

enter image description here

  • In Erweiterung viewDidLoad ich müde Daten vom Modell abzurufen aber passiert nichts, wenn ich das Widget laufen:

    context = CoreDataStack.defaultStack.managedObjectContext 
    
    do { 
    
        request = NSFetchRequest(entityName: "Event") 
        results = try context.executeFetchRequest(request) 
        print(results.count) 
    
        if results.count > 0 { 
    
         for item in results as! [NSManagedObject] { 
    
          let name = item.valueForKey("title") 
    
          print(name!) 
         } 
    
        }//end if 
    
    
    } catch { 
    
        print("there is an error for saving") 
    } 
    
+1

Haben Sie alle erforderlichen Schritte befolgt? zB https://www.invasivecode.com/weblog/sharing-data-between-apps- und-ihr-extenstions/ –

+0

@LorenzoBoaro das sit das albernste tutorial, das ich je gesehen habe! der titel ist über core daten und heute extension aber wenn du dem letzten schritt folgst! es hieß, Kerndaten sind nicht immer gut !!!!! !!! benutze NSUserDefualts !!!!!!!!!!!!!! –

Antwort

4

Da Widgets keinen Anwendungsdelegaten haben, möchten Sie möglicherweise den Hauptdatenstapelcode aus der App-Delegate-Klasse in Ihrer Hauptanwendung verschieben.

Ich verwende normalerweise eine Klasse namens CoreDataStack. Nur alle Methoden in diese neue Klasse zu kopieren, zu ändern lazy zu static:

class CoreDataStack { 
    static var applicationDocumentsDirectory: NSURL? = { ... }() 
    static var managedObjectModel: NSManagedObjectModel = { ... }() 
    static var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { ... }() 
    static var managedObjectContext: NSManagedObjectContext? = { ... }() 
} 

Da diese alle static Variablen können Sie die folgende Syntax verwenden, um die verwalteten Kontext:

let ctx = CoreDataStack.managedObjectContext 

. .. anstelle des typischen Zugriffs durch Ihren App-Delegierten.

Sie sollten diese Datei sowohl zu Ihrem Haupt-App-Ziel als auch zu Ihrem Widget-Ziel hinzufügen, indem Sie die rechte Seitenleiste unter "Ziel-Mitgliedschaft" verwenden. Auf diese Weise greifen Sie an beiden Orten auf Ihren Core-Daten-Stack zu mit allen Ihren Modellen dasselbe zu tun, um sicherzustellen, dass sie in der Erweiterung verfügbar sind

+0

@ Mc.Lieber so leid ... Ich habe keine Benachrichtigung für Ihren Kommentar erhalten. Stellen Sie sicher, dass Sie die CoreDataStack-Klasse direkt verwenden und keine Instanz davon instanziieren.Wenn Sie Ihre Klasse einfügen und mir sagen, wo es Fehler gibt, kann ich Ihnen vielleicht in ein paar Minuten helfen –

+0

Stellen Sie sicher, dass Sie das() am Ende jeder statischen Variablendeklaration nicht vergessen haben –

+0

Die Klasse ist KEIN Singleton (obwohl das ist eine mögliche Lösung). Sie greifen nicht auf CoreDataStack.defaultStack.managedObjectContext zu, Sie verwenden nur CoreDataStack.managedObjectContext @ Mc.Lover –