我的应用程序在设备上进行测试时崩溃,但在模拟器上没有。当我退出时会发生这种情况。我在用户注销时删除核心数据中的所有记录,代码如下:
-(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])
行上发生的调试器。
我不太清楚为什么会发生这种情况,此时“Workout”表中没有记录,因此没有任何内容可以删除。模拟器似乎没有遇到任何问题。
持久存储代码的详细信息:
- (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 :(得分:1)
正如马丁所说,你的错误似乎集中在NSPersistentStore
问题上。处理该错误而不是评论// Handle error
将是非常好的第一步。你很可能在那里得到一个错误并忽略它。
此外,退出时,如果您的目标是删除所有数据,则有一种更简单的方法。
删除Core Data堆栈(释放NSManagedObjectContext
,NSPersistentStoreCoordinator
和NSManagedObjectModel
),然后删除SQLite文件。下次发布时,所有数据都消失了。