Невозможно выполнить запрос на получение запроса после создания базы данных. - PullRequest
1 голос
/ 13 февраля 2012

Я получаю эту ошибку при попытке добавить запись в свою базу данных:

2012-02-12 20:15:18.187 Flavma[3197:707] CoreData: error: Serious application error.  
An exception was caught from the delegate of NSFetchedResultsController during a call to -
controllerDidChangeContent:.  *** -[__NSArrayI objectAtIndex:]: 
index 1 beyond bounds [0 .. 0] with userInfo (null)

Я пытался добавить все, что могу, но сейчас я использую эту категорию:

#import "Patient+Create.h"

@implementation Patient (Create)

+ (Patient *)patientWithLastName:(NSString *)lastName inManagedObjectContext:(NSManagedObjectContext *)context
{
    Patient *patient = nil;
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Patient"];
    request.predicate = [NSPredicate predicateWithFormat:@"lastName = %@", lastName];
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"lastName" ascending:YES];
    request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

    NSError *error = nil;
    NSArray *patients = [context executeFetchRequest:request error:&error];

    if (!patients || ([patients count] > 1)) {
        //handle error
    } else if (![patients count]) {
        //create a new one
        patient = [NSEntityDescription insertNewObjectForEntityForName:@"Patient" inManagedObjectContext:context];
        patient.lastName = lastName;
    } else {
        patient = [patients lastObject];
    }
    return patient;
}

@end

Я могу добавить данные в свою базу данных при ее первом создании (если я удалю приложение с моего устройства), например так:

- (void) fetchPatientDataIntoDocument:(UIManagedDocument *)document
{
    dispatch_queue_t fetchQ = dispatch_queue_create("Patient fetcher", NULL);
    dispatch_async(fetchQ, ^{
        [document.managedObjectContext performBlock:^{
            [Patient patientWithLastName:@"Johnson" inManagedObjectContext:self.patientDatabase.managedObjectContext];
        }];
    });
    dispatch_release(fetchQ);
}

Но после этого я продолжаю получать ту же ошибку,Есть идеи?

1 Ответ

1 голос
/ 13 февраля 2012
#import "Patient+Create.h"

@implementation Patient (Create)
+ (Patient *)patientWithLastName:(NSString *)lastName inManagedObjectContext:(NSManagedObjectContext *)context
{
    Patient *patient = nil;
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Patient"];
    request.predicate = [NSPredicate predicateWithFormat:@"lastName = %@", lastName];
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"lastName" ascending:YES];
    request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

    NSError *error = nil;
    NSArray *patients = [context executeFetchRequest:request error:&error];

    if (!patients || [patients count]<=0) {
        //create a new one
        patient = [NSEntityDescription insertNewObjectForEntityForName:@"Patient" inManagedObjectContext:context];
        patient.lastName = lastName;
    [context performSelectorOnMainThread:@selector(save:) withObject:nil waitUntilDone:YES];    
    } else {
        patient = [patients lastObject];
    }
    return patient;
}

@end

Просто сохраните вновь созданный объект в главном потоке. Причиной этого является создание объекта во вторичном потоке (GCD), эти изменения не будут действовать, пока вы не сохраните контекст в основном потоке

[context performSelectorOnMainThread:@selector(save:) withObject:nil waitUntilDone:YES];    
...