Je voudrais ajouter des données de base à un projet iPhone existant, mais j'obtiens encore beaucoup d'erreurs de compilation:
- NSManagedObjectContext undeclared
- Expected specifier-qualifier-list before 'NSManagedObjectModel'
- ...
J'ai déjà ajouté le Core Data Framework à la cible (clic droit sur mon projet sous "Targets", "Add" - "Existing Frameworks", "CoreData.framework").
Mon fichier d'en-tête:
NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;
NSPersistentStoreCoordinator *persistentStoreCoordinator;
[...]
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
Qu'est-ce que je rate? Démarrer un nouveau projet n'est pas une option ...
Merci beaucoup!
edit
désolé, j'ai ces implémentations ... mais il semble que la bibliothèque soit manquante ... les méthodes d'implémentation sont pleines avec des erreurs de compilation comme " managedObjectContext undeclared
", " NSPersistentStoreCoordinator undeclared
", mais aussi avec "Attendu ')' avant NSManagedObjectContext
" (bien qu'il semble que les parenthèses sont correctes) ...
#pragma mark -
#pragma mark Core Data stack
/**
Returns the managed object context for the application.
If the context doesn't already exist, it is created and bound to the persistent store
coordinator for the application.
*/
- (NSManagedObjectContext *) managedObjectContext {
if (managedObjectContext != nil) {
return managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator: coordinator];
}
return managedObjectContext;
}
/**
Returns the managed object model for the application.
If the model doesn't already exist, it is created by merging all of the models found in
application bundle.
*/
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return managedObjectModel;
}
/**
Returns the persistent store coordinator for the application.
If the coordinator doesn't already exist, it is created and the application's store added to it.
*/
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
stringByAppendingPathComponent: @"Core_Data.sqlite"]];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil URL:storeUrl options:nil error:&error]) {
/*
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. If it is not possible to recover from the error, display an alert panel that
instructs the user to quit the application by pressing the Home button.
Typical reasons for an error here include:
* The persistent store is not accessible
* The schema for the persistent store is incompatible with current managed object
model
Check the error message to determine what the actual problem was.
*/
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return persistentStoreCoordinator;
}
Juste pour expliquer toutes les étapes que vous devez réellement effectuer pour ajouter des données de base à un projet qui ne les avait pas auparavant:
Étape 1: ajouter le cadre
Cliquez sur la cible de votre application (sur le volet de gauche, c'est l'icône du haut avec le nom de votre application) puis allez dans l'onglet 'Build Phases' puis sur 'Link Binary With Libraries', cliquez sur le petit '+' en bas puis trouvez 'CoreData.framework' et ajoutez-le à votre projet
Ensuite, soit importez des coredata sur tous les objets dont vous avez besoin (de manière non sexy) en utilisant:
Rapide
Objectif c
ou ajoutez l'importation sous les importations courantes dans votre fichier .pch (beaucoup plus sexy) comme ceci:
Étape 2: ajouter le modèle de données
Pour ajouter le fichier .xcdatamodel, faites un clic droit / contrôle-cliquez sur vos fichiers dans le volet de droite (comme dans un dossier Ressources pour une conservation en toute sécurité) et sélectionnez Ajouter un nouveau fichier, cliquez sur l'onglet Données de base lors de la sélection de votre type de fichier, puis cliquez sur ' Modèle de données ', donnez-lui un nom et cliquez sur Suivant et Terminer et il l'ajoutera à votre projet. Lorsque vous cliquez sur cet objet modèle, vous verrez l'interface pour ajouter les entités à votre projet avec les relations que vous souhaitez.
Étape 3: mettre à jour le délégué d'application
Dans Swift sur AppDelegate.swift
Dans Objective C, assurez-vous d'ajouter ces objets à AppDelegate.h
Synthétisez les objets précédents dans AppDelegate.m comme ceci:
Ajoutez ensuite ces méthodes à AppDelegate.m (assurez-vous de mettre le nom du modèle que vous avez ajouté dans les emplacements indiqués):
Étape 4: acheminez les objets de données vers les ViewControllers là où vous avez besoin des données
Option 1. Utilisez ManagedObjectContext du délégué d'application à partir de VC (préféré et plus facile)
Comme suggéré par @ brass-kazoo - Récupérez une référence à AppDelegate et à son managedObjectContext via:
Rapide
Objectif c
dans votre ViewController
Option 2. Créez ManagedObjectContext dans votre VC et faites-le correspondre à AppDelegate de AppDelegate (Original)
Afficher uniquement l'ancienne version pour Objective C car il est beaucoup plus facile d'utiliser la méthode préférée
dans le ViewController.h
Dans le ViewController.m
Dans l'AppDelegate, ou la classe où le ViewController est créé, définissez managedObjectContext pour qu'il soit identique à celui d'AppDelegate
Si vous voulez que le viewcontroller utilisant Core Data soit un FetchedResultsController, vous devez vous assurer que ce contenu est dans votre ViewController.h
Et c'est dans ViewController.m
Après tout cela, vous pouvez maintenant utiliser ce managedObjectContext pour exécuter toutes les requêtes fetchRequests habituelles nécessaires à la bonté CoreData! Prendre plaisir
la source
[[UIApplication sharedApplication] delegate]
, puis le contexte via[appDelegate managedObjectContext]
Pour Swift 3: INCLUT LA SAUVEGARDE ET LA RÉCUPÉRATION DES DONNÉES
Étape 1 : Ajouter un cadre
Étape 2: Ajouter un modèle de données
Fichier> Nouveau> Fichier> Données de base> Modèle de données
SampleData
le fichier résultant seraitSampleData.xcdatamocelId
Étape 3: Ajoutez les fonctions ci-dessous à votre délégué d'application et ajoutez «importer CoreData» en haut
ÉTAPE 4: Ajouter une entité et un attribut au modèle
a) Ajouter une entité
b) Ajouter un attribut
ÉTAPE 5: Sauvegarde des données
ÉTAPE 5: Récupération des données
la source
Essayez de créer une application Cocoa basée sur Core Data et regardez AppDelegate. Vous y verrez des méthodes d'implémentation de la pile de données de base, ainsi qu'un fichier de modèle d'objet géré pour définir vos entités et d'autres éléments liés aux données de base.
Vous nous avez montré uniquement l'en-tête (c'est-à-dire la déclaration), mais pas l'implémentation (c'est-à-dire la définition) de la pile Core Data.
la source
Si vous rencontrez ce même problème dans xcode 4, comme je l'ai fait. C'est différent: j'ai dû sélectionner le projet, puis dans les cibles développez "Link Binary With Libraries" qui montre les bibliothèques actuelles. De là, cliquez sur le + (signe plus) pour sélectionner les bibliothèques supplémentaires dont vous avez besoin. Je l'ai placé en haut du projet et j'ai dû le déplacer (glisser-déposer) vers le groupe Frameworks , mais c'était tout.
la source
Comme Eimantas l'a déclaré, vous manquez l'implémentation de la Core Stack, comme
La solution serait de créer un nouveau projet de pilote de données de base et de copier / coller l'implémentation dans votre projet.
la source
Pour Swift 3:
Fichier-> nouveau fichier-> CoreData-> Modèle pour créer un modèle.
Reportez-vous à ce lien pour plus d'informations sur sa mise en œuvre.
la source
// dans Swift 2.2, vous pouvez effectuer les opérations suivantes sans modifier le fichier AppDelegate.
Fichier-> nouveau fichier-> ios-> classe Cocoa Touch -> définissez sa sous-classe comme NSObject-> nommez-le comme DataController.swift Dans le fichier, incluez ///
import UIKit importation de la classe CoreData DataController: NSObject {
}
//////
/////// graine () -> def
// fetch () def
la source
view.h
detail.h
la source
.h
la source
la source
la source
exemple de vue de codage1
exemple de vue détaillée
savebutton
la source