Coredata - &ndquo; NSObjectInaccessibleException - CoreData无法完成故障”

我是核心数据的新手,仍在搞清楚螺母和螺栓,这个错误一直困扰着我几个小时,我似乎无法找到解决方案。任何帮助是极大的赞赏。 问题是这样的 我有两个视图从服务器获取数据并更新UI。我已经用这种方式建立了流程 view1 - >从服务器发送HTTP请求 - 接收回调 - >将数据保存到Coredata - >从核心数据读取并在UI上显示(回调和保存/读取Coredata发生在ViewController中) view2 - >从服务器发送HTTP请求 - 接收回调 - >将数据保存到Coredata - >从核心数据读取并在UI上显示(回调和保存/读取Coredata发生在ViewController中) 视图2每3秒重复此过程,因为这是一个自动刷新屏幕。 问题是每当我尝试快速切换视图1和2时,它会因上述错误而崩溃应用程序。如果我在每个视图上等待几秒钟(等待从服务器获取数据),它可以正常工作。我做错了什么,我需要修改什么?
- (void) refreshData {
    [super refreshData];
    [[UserDataFactory sharedSingleton] refreshLoggedInUserDataAndRespondTo:self user:self.user];
}

- (BOOL) refreshDataCallback:(QExtendedHTTPOperation*)responseOperation {
    [self saveToCoreData: responseOperation.responseArray];
    NSMutableArray *tmp = [[NSMutableArray alloc] initWithArray:[self readFromCoreData]];
    [self setData: tmp];
    [tmp release];
    [self.tableView reloadData];
    return YES;
}

- (void) saveToCoreData:(NSArray *) responseArray{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"CoreView1" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    [fetchRequest setReturnsObjectsAsFaults:NO];
    NSError *error;
    NSArray *items = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    [fetchRequest release];

    for (NSManagedObject *managedObject in items) {
            [self.managedObjectContext deleteObject:managedObject];
    }

    for (int i=0; i<[responseArray count]; i++) {
            CoreView1 *coreView1_ = [NSEntityDescription insertNewObjectForEntityForName:@"CoreView1" inManagedObjectContext:self.managedObjectContext];
            coreView_.id = [[responseArray objectAtIndex:i] id];    
            [self.managedObjectContext insertObject:coreView1_];
    }
    [self saveContext:self.managedObjectContext];
}

- (NSArray *) readFromCoreData{ 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"CoreView1" inManagedObjectContext:self.managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:entity];
    [fetchRequest setReturnsObjectsAsFaults:NO];
    NSError *error;
    NSMutableArray *fetchedObjects = [[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
    [fetchRequest release];
    return [fetchedObjects autorelease];
}
这是我正在使用的示例代码,即使View2具有相同的回调并遵循相同的流程。 编辑1 忘了提到这个,我总是在saveToCoreData方法中得到错误。此外,还有一点需要注意的是,如果我删除代码以删除对象,它一切正常(我需要在保存更新的数据之前从表中删除所有现有数据)。不知道发生了什么事。     
已邀请:
删除删除代码的原因使它工作是因为您正在删除持久存储中的数据而不更新仍然具有与仍在内存中的数据相关联的托管对象实例的其他视图。请记住,当Core Data处理对象时,每个对象都必须在其后面的数据库中有一行。当您删除该行时,Core Data会生气。 因此,要解决此问题并仍然删除您的数据,您应该让您的视图收听
NSManagedObjectContextWillSaveNotification
和/或
NSManagedObjectContextDidSaveNotification
通知,并使用商店中最新版本的数据更新您的观看次数。此时,您应该丢弃视图所持有的任何Core Data对象,并从商店重新加载它们。     
我刚刚在我的代码中解决了这个错误。好像我的缓存在某种程度上被破坏了。我用过Christopher Pickslay&amp; Keil Gillard建议删除或重命名我的缓存,瞧,崩溃解决了。 NSFetchedResultsController索引超出边界     
对于昨天的信息,我有同样的错误。我检查了应用程序的实时版本,它仍然存在。让人惊讶。 我完成了向核心数据堆栈添加信息的所有排列,直到崩溃发生。 然后我使用SqliteManager在模拟器库中查看应用程序中的sqlite文件。我在一个表中发现了数据错误。这是因为第一次运行应用程序时使用了启动数据库。错误发生在启动器db中。 再次运行应用程序,测试每个表中的每个字段。发现了几次事件。我记得读过这个问题,并认为也许其他人可以从我的错误中受益。     
您在readFromCoreData方法中过度释放fetchedObjects。无论如何,executeFetchRequest将返回给你自动释放的对象。当前运行循环完成执行时(当您从视图跳转时),它会尝试两次释放对象(假设您没有使用自己的自动释放池)。 我改变了
return [fetchedObjects autorelease]; 
return fetchedObjects;
    

要回复问题请先登录注册