Повторяющиеся записи в Core Data при получении - PullRequest
1 голос
/ 21 сентября 2009

Люди,

У меня есть небольшая загадка, касающаяся Core Data в моем проекте iPhone. Во время метода viewDidLoad в двух отдельных экземплярах контроллера представления я вызываю следующий метод:

- (NSFetchedResultsController *)getStudentResults:(NSString *)classRoom forWeekStarting:(NSDate *)startDate andEnding:(NSDate *)endDate {
    AttendanceAppDelegate *appDelegate = (AttendanceAppDelegate *)[[UIApplication sharedApplication] delegate];

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:[appDelegate managedObjectContext]];

    int secondsInAWeek = 60 * 60 * 24 * 7;
    NSDate *today = [[NSDate alloc] init];
    NSDate *nextWeek = [[NSDate alloc] initWithTimeIntervalSinceNow:secondsInAWeek];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(student.classRoom like %@) AND (dateTime >= %@) AND (dateTime <= %@)", classRoom, startDate, endDate];
    [request setPredicate:predicate];
    [request setEntity:entityDescription];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"dateTime" ascending:YES];
    NSArray *descriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [request setSortDescriptors:descriptors];
    [descriptors release];
    [sortDescriptor release];
    [nextWeek release];
    [today release];


    NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:[appDelegate managedObjectContext] sectionNameKeyPath:nil cacheName:@""];
    NSError *error; 
    if (![fetchedResultsController performFetch:&error])
        NSLog(@"Error performing fetch on fetchedResultsController: %@", [error localizedDescription]);

    if (fetchedResultsController == nil || [[fetchedResultsController fetchedObjects] count] == 0) { 
        Student *student = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:[appDelegate managedObjectContext]];
        NSData *classRoomStudentData = [[NSData alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"STUDENT_ATTENDANCE" ofType:@"XML"]];
        [student setClassRoom:@"default"];
        [student buildWithStudentData:classRoomStudentData startingWithXPathNode:@"//attendance"];

        NSError *error; 
        if (![[appDelegate managedObjectContext] save:&error]) { 
            NSLog(@"Error saving the managedObjectContext: %@", [error localizedDescription]);
        }

        if (![fetchedResultsController performFetch:&error])
            NSLog(@"Error performing fetch on fetchedResultsController: %@", [error localizedDescription]);
    }
    return fetchedResultsController;
}

Каждый раз, когда я запускаю свое приложение, количество объектов Student увеличивается на количество исходных объектов (каждый исходный объект дублируется один раз). Поэтому, если я начну с 4, в следующий раз я получу 8, затем 12, затем 16 и т. Д. Я не могу понять, почему, поскольку код для анализа XML вызывается только тогда, когда выборка не возвращает объектов.

Любая помощь будет оценена, спасибо.

- Майкл

1 Ответ

4 голосов
/ 21 сентября 2009

Вы вставляете новые объекты не только тогда, когда выборка не возвращает объектов: глядя на ваш код

if (fetchedResultsController == nil || [[fetchedResultsController fetchedObjects] count] == 0)

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

Рекомендуется инициализировать NSfetchedResultsController, как показано во всем примере кода, предоставленном Apple. По сути, вы начинаете с проверки, равен ли fetchedResultsController нулю или нет. Если нет, вы просто возвращаете переменную. В противном случае вы инициализируете его.

См. Мой ответ на этот вопрос для примера:

Как правильно настроить NSFetchedResultsController

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...