web-dev-qa-db-fra.com

Comment accéder au modèle Core Data dans l'extension d'aujourd'hui (iOS)

Est-il possible de travailler avec mon modèle CoreData dans l'extension Today en Swift comme dans l'application d'origine? Si oui, comment puis-je créer le NSManagedObjectContext?
Je n'ai vraiment aucune idée, à part l'identifiant de groupe, mais malheureusement je ne sais pas comment obtenir le contexte ..
Dans le passé, j'ai créé des applications avec la vérification au début que je veux utiliser CoreData, puis j'ai obtenu le managedObjectContext via mon AppDelegate .. Mais comment puis-je faire quelque chose comme ça dans une extension? Apple n'offre pas d'informations à ce sujet ..

J'ai édité cette ligne dans AppDelegate:

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"HTWcampus.sqlite"];

à cela (après avoir inclus le groupe dans les deux cibles):

NSURL *storeURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.BenchR.TodayExtensionSharingDefaults"];
storeURL = [storeURL URLByAppendingPathComponent:@"HTWcampus.sqlite"];
NSLog(@"StoreURL2: %@", storeURL);

Avec cela, la base de données existante dans mon application avait disparu (ce qui est génial, car je pense que cela a fonctionné pour mettre la base de données dans le segment partagé).

Mais comment puis-je créer une instance de mon contexte dans l'extension? Et comment puis-je accéder à mes sous-classes NSManagedObject?

Dans l'extension, j'ai ce code jusqu'à présent:

var context: NSManagedObjectContext!

override func viewDidLoad() {
    super.viewDidLoad()

    var storeURL = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.BenchR.TodayExtensionSharingDefaults")
    storeURL = storeURL?.URLByAppendingPathComponent("HTWcampus.sqlite")
    let modelURL = NSBundle.mainBundle().URLForResource("HTWcampus", withExtension: "momd")
    let model = NSManagedObjectModel(contentsOfURL: modelURL)
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: model)
    coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: nil)
    context = NSManagedObjectContext()
    context.persistentStoreCoordinator = coordinator
}

Est-ce correct? Et si oui, comment puis-je y insérer mes sous-classes NSManagedObject? Et dois-je ajouter le fichier momd à la cible des extensions? Si oui, comment faire?

36
Ben

Ce que vous voulez vraiment, c'est accéder à votre magasin persistant (probablement une base de données SQLite). Pour y parvenir, vous devez configurer les groupes d'applications et vous assurer que votre application hôte configure la pile Core Data à l'aide de votre conteneur partagé (afin que votre magasin soit également accessible en extension). Quelque chose comme:

    NSString *containerPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:YOUR_SECURITY_APP_GROUP].path;
    NSString *sqlitePath = [NSString stringWithFormat:@"%@/%@", containerPath, @"database.sqlite"];

Ensuite, dans votre extension, créez simplement un coordinateur de magasin persistant avec des contextes d'objets gérés à l'aide de la base de données dans un conteneur partagé. Vous pouvez partager votre modèle (.momd) et vos sous-classes d'objets gérés avec l'extension simplement en vous assurant qu'ils sont également inclus dans la cible d'extension.

Modifier:

Pour ajouter votre modèle et vos sous-classes d'objets gérés:

1. Make sure you have your app and extension targets

  1. Assurez-vous d'avoir des cibles d'application et d'extension

    2. Click on your model file, and select both targets under 'Target Membership' on right-hand panel

  2. Cliquez sur votre fichier modèle et sélectionnez les deux cibles sous "Adhésion cible" dans le panneau de droite

    3. Repeat the same with all your managed object subclasses

  3. Répétez la même chose avec toutes vos sous-classes d'objets gérés
68
kkodev