2010-08-20 3 views
0

Mon application plante lorsque vous testez sur l'appareil, mais pas sur le simulateur. Cela arrive quand je vais me déconnecter. Je supprimer tous les enregistrements de données de base lorsque l'utilisateur se déconnecte, le code comme suit:Suppression d'objets à partir de données de base - application bloquante

-(IBAction)logOut 
{ 
    UIAlertView *getConfirmation = [[UIAlertView alloc] initWithTitle:@"Confirm" message:@"Are you sure you want to logout. You will lose any unsync'ed workouts." delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Logout", nil]; 
    [getConfirmation show]; 
} 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if (buttonIndex == 1){ 
     // Clear the database of all objects when the user logs out. 
     [self deleteAllObjects:@"Workout"]; 
     [self deleteAllObjects:@"Route"]; 
     [self deleteAllObjects:@"WayPoint"]; 
     [self deleteAllObjects:@"Graphs"]; 
     [self deleteAllObjects:@"userSettings"]; 

     [self presentModalViewController:loginViewController animated:NO]; 
    } 
} 


-(void)deleteAllObjects:(NSString *)entityDescription{ 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityDescription inManagedObjectContext:managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    NSError *error; 
    NSArray *items = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
    [fetchRequest release]; 

    for (NSManagedObject *managedObject in items) { 
     [managedObjectContext deleteObject:managedObject]; 
     NSLog(@"%@ object deleted", entityDescription); 
    } 

    if (![managedObjectContext save:&error]) { 
     NSLog(@"Error deleting %@ - error:%@",entityDescription,error); 
    } 
} 

Il semble se produire lorsque le journal I et déconnecter immédiatement. Dans ce cas, il n'y aurait pas d'objets sur 4 des 5 tables (note: userSettings aurait 1 enregistrement).

En regardant la console, le message d'erreur est '*** Terminaison de l'application en raison d'une exception non interceptée' NSInternalInconsistencyException ', raison:' Ce NSPersistentStoreCoordinator n'a pas de stockage persistant. Il ne peut pas effectuer une opération de sauvegarde. '', En regardant le débogueur se produire sur la ligne if (![managedObjectContext save:&error]).

Je ne sais pas exactement pourquoi cela se produit, il n'y aurait pas d'enregistrements dans la table 'Workout' à ce stade, donc il n'y aurait rien à supprimer. Le simulateur semble gérer cela sans problème.

Détails du code persistant de magasin:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 

    if (persistentStoreCoordinator != nil) { 
     return persistentStoreCoordinator; 
    } 

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"LegginitCoreData.sqlite"]]; 

    NSError *error; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; 
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) { 
     // Handle error 
    }  

    return persistentStoreCoordinator; 
} 

Toute aide serait très apprécié, je suis bloqué sur celui-ci ne et pas sûr où aller d'ici.

+0

En regardant la sortie de la console et peut-être le rapport d'accident sera certainement utile. – Eiko

+0

Jetez un oeil dans le débogueur à quelle ligne de code l'application se bloque – rano

+0

Désolé, je devrais avoir posté les résultats de la console ainsi. Je vais le faire maintenant. – Stephen

Répondre

1

Comme Martin a déclaré que votre erreur semble être centrée autour du problème NSPersistentStore. Remettre cette erreur au lieu d'avoir un commentaire de // Handle error serait un très bon premier pas. Il est tout à fait possible que vous receviez une erreur et que vous l'ignoriez.

En outre, à la sortie, si vous souhaitez supprimer toutes les données, il existe un moyen plus simple.

Détruisez la pile de données de base (en libérant les NSManagedObjectContext, NSPersistentStoreCoordinator et NSManagedObjectModel), puis supprimez le fichier SQLite. Au prochain lancement, toutes les données ont disparu.

Questions connexes