我是Core数据的新手,但仍然想尽办法,这个错误困扰了我好几个小时,我似乎找不到解决方法。任何帮助是极大的赞赏。

问题是这样的

我有两个 View ,可从服务器获取数据并更新UI。我已经以这种方式设置了流程

view1->从服务器发送HTTP请求-接收回调->将数据保存到Coredata->从Core Data读取并在UI上显示(回调和保存/读取Coredata发生在ViewController中)

view2->从服务器发送HTTP请求-接收回调->将数据保存到Coredata->从Core Data读取并在UI上显示(回调和保存/读取Coredata发生在ViewController中)

View 2每3秒重复一次此过程,因为这是一个自动刷新屏幕。

问题是,每当我尝试快速在 View 1和 View 2之间切换时,都会因上述错误而使应用程序崩溃。如果我在每个 View 上等待几秒钟(等待从服务器中获取数据),则可以正常工作。我做错什么了,我需要修改什么?

- (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方法中得到错误。另外,还有一点需要注意的是,如果删除代码以删除对象,则一切正常(在保存更新的数据之前,需要从表中删除所有现有数据)。虽然不确定发生了什么。

最佳答案

删除删除代码使之起作用的原因是,您要删除持久性存储中的数据,而没有更新另一个 View ,该 View 仍将受管对象实例绑定(bind)到仍在内存中的该数据。请记住,虽然核心数据处理对象,但是每个对象在数据库中都必须在其后面具有一行。当您删除该行时,Core Data会生气。

因此,要解决此问题并仍然删除数据,您应该让 View 侦听NSManagedObjectContextWillSaveNotification和/或NSManagedObjectContextDidSaveNotification通知,并使用商店中数据的最新版本更新 View 。此时,您应该丢弃 View 要保留的所有Core Data对象,然后从存储中重新加载它们。

关于iphone - Coredata- “NSObjectInaccessibleException - CoreData could not fulfill a fault”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5591301/

10-12 00:15
查看更多