2010-08-20 88 views
0

我的应用程序在设备上测试时崩溃,但在模拟器上未测试。它发生在我注销时。我删除从核心数据都记录在用户注销时,代码如下:从核心数据删除对象 - 崩溃的应用程序

-(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); 
    } 
} 

这似乎是发生在我登录和注销立竿见影。在这种情况下,5个表中的4个不会有对象(注意:userSettings会有1条记录)。

看看控制台的错误消息是'***终止应用程序,由于未捕获的异常'NSInternalInconsistencyException',原因:'此NSPersistentStoreCoordinator没有持久性存储。它不能执行保存操作。'',看着调试器发生在线if (![managedObjectContext save:&error])上。

我不太清楚为什么会发生这种情况,此时在表格“锻炼”中没有记录,因此没有任何可删除的记录。模拟器似乎处理这个没有问题。持久性存储代码的

详情:

- (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; 
} 

任何帮助将不胜感激,我卡在这一个不是,也不知道从哪里何去何从。

+0

看着控制台的输出,也许崩溃报告肯定会有帮助。 – Eiko 2010-08-20 09:20:35

+0

在调试器中查看应用程序崩溃的代码行 – rano 2010-08-20 09:27:39

+0

对不起,我应该从控制台发布结果。我现在就做。 – Stephen 2010-08-20 09:36:20

回答

1

正如Martin所说,您的错误似乎集中在NSPersistentStore问题上。处理这个错误,而不是有// Handle error的评论将是一个非常好的第一步。你很可能会在那里发现一个错误并忽略它。

此外,在退出时,如果您的目标是删除所有数据,则有一种更简单的方法。

撕下核心数据堆栈(释放NSManagedObjectContext,NSPersistentStoreCoordinatorNSManagedObjectModel),然后删除SQLite文件。在下次启动时,所有数据都消失了。