2

J'ai donc un projet avec un UITabBarController et quelques contrôleurs de navigation, et j'essaie d'implémenter des données de base. C'est juste ne fonctionne pas.Données de base et contrôleur UITabBar - aide?

J'ai un peu d'une configuration bizarre: UITabBarController -> Navigation Controller -> Tableau contrôleur

J'ai copié tout le code de base de données et a ajouté une entité avec un attribut (« événement » et ' name '- tout comme les tutoriels). Je continue à obtenir l'erreur: app erminating en raison d'une exception non interceptée « NSInternalInconsistencyException », raison: « + entityForName: ne pouvait pas trouver un NSManagedObjectModel pour le nom de l'entité « Event » »

L'erreur ne se produit que lorsque je passe à la table View Je veux peuplé par le contenu de base de données.

Je trouve que l'erreur se produit sur cette ligne dans le tableau View Controller:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext];

Cela semble correspondre à ce (dans le délégué App):

NSManagedObjectContext *context = [self managedObjectContext]; 

if (!context) { 

    // Handle the error. 

NSLog(@"\nCould not create *context for self");

} 

rootViewController.managedObjectContext = context; 

Toute aide?

Mise à jour: J'ai réussi à le faire fonctionner (moment très excitant, et Stanford gagne à la mi-temps - jusqu'à présent c'est une bonne journée). Je me réfère maintenant à partir de l'App Delegate. Ahhh, cela semble tellement bon :)

Répondre

6

Votre contexte d'objet géré n'est probablement pas défini et l'entité "Evénement" n'est évidemment pas valide pour un contexte nul.

J'utilise une référence à mon délégué d'application dans tous mes contrôleurs de vue afin qu'ils puissent accéder au contexte d'un objet géré. Il semble que d'autres utilisent souvent un singleton pour gérer les données de base et obtenir le contexte de l'objet géré à partir de cela.

MISE À JOUR

Il y a une bonne discussion sur l'endroit où garder la pile de données de base dans Where to place the “Core Data Stack” in a Cocoa/Cocoa Touch application.

Voici quelques exemples de code pour garder la pile de données de base dans le délégué de l'application:

utilisation standard d'Apple implémentation de la pile de données de base dans YourAppDelegate. managedObjectContext est implémenté à titre d'exemple, mais managedObjectModel et persistentStoreCoordinator doivent également être implémentés.

YourAppDelegate.h:

@interface YourAppDelegate : NSObject <UIApplicationDelegate> { 
    // Core Data stuff 
    NSManagedObjectModel *managedObjectModel; 
    NSManagedObjectContext *managedObjectContext;  
    NSPersistentStoreCoordinator *persistentStoreCoordinator; 

    // other app ivars 
} 

YourAppDelegate.m:

- (NSManagedObjectContext *) managedObjectContext { 
    if (managedObjectContext != nil) { 
     return managedObjectContext; 
    } 
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext = [[NSManagedObjectContext alloc] init]; 
     [managedObjectContext setPersistentStoreCoordinator: coordinator]; 
    } 
    return managedObjectContext; 
} 

Dans chaque contrôleur de vue, obtenir une référence au délégué de l'application et l'utiliser pour obtenir le managedObjectContext comme nécessaire. Par exemple, lors de la configuration de fetchedResultsController;

RootViewController.h:

@interface RootViewController : UITableViewController <NSFetchedResultsControllerDelegate> { 
    NSFetchedResultsController *fetchedResultsController; 

    YourAppDelegate *app; 
} 

RootViewController.m:

#import "RootViewController.h" 
#import "YourAppDelegate.h" 

@implementation RootViewController 

@synthesize fetchedResultsController; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    app = (YourAppDelegate*)[UIApplication sharedApplication].delegate; 
} 

- (NSFetchedResultsController *)fetchedResultsController { 
    if (fetchedResultsController != nil) { 
     return fetchedResultsController; 
    } 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:app.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    // setup the batch size, predicate, & sort keys, etc 

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:app.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    [aFetchedResultsController release]; 
    [fetchRequest release]; 

    return fetchedResultsController; 
}  
+0

pouvez-vous me donner un exemple de la façon dont vous le faites? –

+0

La réponse a été mise à jour avec un exemple de code. – gerry3

0

Assurez-vous que vous avez votre TableView (RootViewController) dans IB relié à la sortie de votre délégué de l'application.

0

J'ai rencontré ce même problème, je vais partager ma solution.

D'abord vous avez besoin d'une référence au contrôleur de navigation dans la barre d'onglets dans le fichier nib, assurez-vous de le connecter.

IBOutlet UINavigationController *navigationController; 

Ensuite, obtenir le contrôleur comme recommandé dans la documentation de support et de lui envoyer le managedObjectContext:

SavedTableViewController *saved = (SavedTableViewController *)[navigationController topViewController]; 
saved.managedObjectContext = self.managedObjectContext; 

Alex (d'un autre poste) est juste, « Vous devriez généralement rester à l'écart d'obtenir des objets partagés du délégué de l'application: il se comporte trop comme une variable globale, et tout un tas de problèmes y sont associés. "

0

gerry3 Citation:

It sounds like others often use a singleton to manage Core Data and would get the managed object context from that.

Pour quiconque essaye de résoudre ce problème en l'implémentant en utilisant un singleton, j'ai lancé la nouvelle question here.

Questions connexes