Как проверить, есть ли у собственности какие-либо отношения? - PullRequest
0 голосов
/ 03 июня 2011

У меня есть сущность Session. На мой взгляд, сущность Exercise может быть добавлена ​​к Session.

Перед сохранением я хочу проверить, есть ли какие-либо отношения с Session, поэтому, если нет, я удалю объект перед сохранением.

Может кто-нибудь сказать мне, как это сделать?

Edit:

- (void)createSession
{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
    NSDateComponents *dateComponentsForToday = [calendar components:unitFlags fromDate:self.picker.date];
    [dateComponentsForToday setHour:0];
    [dateComponentsForToday setMinute:0];
    [dateComponentsForToday setSecond:0];
    NSDate *targetDateBegins = [calendar dateFromComponents:dateComponentsForToday]; 
    NSDate *targetDateEnds = [targetDateBegins dateByAddingTimeInterval:(60 * 60 * 24 - 1)];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat: @"(timeStamp >= %@ && timeStamp <= %@)", targetDateBegins, targetDateEnds]];
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"Session" inManagedObjectContext:managedObjectContext]];
    NSLog(@"timeStamp >= %@ && timeStamp <= %@", targetDateBegins, targetDateEnds);

    NSError *error = nil;
    NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    NSLog(@"Fetch error: %@", error);

    if ([results count])
    {
        session = (Session *)[results objectAtIndex:0];
    }
    else
    {
        session = (Session *)[NSEntityDescription insertNewObjectForEntityForName:@"Session" inManagedObjectContext:managedObjectContext];
        session.timeStamp = self.picker.date;
    }

    NSSet *filteredExercisesFromSession = [session.exercises filteredSetUsingPredicate:[NSPredicate predicateWithFormat: @"name == %@",selectedExerciseName]];
    if ([filteredExercisesFromSession count] > 0)
    {
        self.exercise = [filteredExercisesFromSession anyObject];
    }

    [fetchRequest release];
    self.fetchedResultsController = nil;
    [setsTableView reloadData];
}

-(IBAction)createSet
{    
    NSSet *filteredExercisesFromSession = [session.exercises filteredSetUsingPredicate:[NSPredicate predicateWithFormat: @"name == %@",selectedExerciseName]];

    if ([filteredExercisesFromSession count] > 0)
    {
        self.exercise = [filteredExercisesFromSession anyObject];
    }
    else
    {
        NSLog(@"exercise does not already exist");
        self.exercise = (Exercise *)[NSEntityDescription insertNewObjectForEntityForName:@"Exercise" inManagedObjectContext:managedObjectContext];
        self.exercise.name = selectedExerciseName;
        self.exercise.muscleGroup = muscleName;
        [session addExercisesObject:exercise];
    }

    Set *set = (Set *)[NSEntityDescription insertNewObjectForEntityForName:@"Set" inManagedObjectContext:managedObjectContext];
    set.weight = [NSNumber numberWithFloat:weightSelected2];
    set.reps = [NSNumber numberWithInt:repSelected];
    set.timeStamp = self.picker.date;
    [self.exercise addSetsObject:set];

    NSError *error = nil;
    if (![managedObjectContext save:&error]) 
    {
        // Handle the error.
    }
    NSLog(@"error: %@", error);
    self.fetchedResultsController = nil; 
    [setsTableView reloadData];
}

1 Ответ

0 голосов
/ 04 июня 2011

РЕДАКТИРОВАТЬ Какой неясный вопрос ...!В следующий раз, пожалуйста, напишите сначала код.

Ваш NSPredicate может быть неправильным, попробуйте это:

[NSPredicate predicateWithFormat:@"(date >= %@) AND (date <= %@)",
                                   startDate, endDate];

ENDOFEDIT


Простоизвлеките объект, чтобы убедиться, что он существует или нет.

Если ваше отношение Session 1->n Exercise, то у вас должно быть обратное отношение , например myExercise.session, чтобы легко проверить (извлечь).Или вы можете просто использовать обычный NSFetchRequest ...

Также обратите внимание, что в CoreData есть «каскадные» средства удаления, но я сомневаюсь, что это может помочь в вашем случае (дочерней сущности).

Без какого-либо кода / деталей трудно понять, в чем заключается ваша проблема и как ее решить.

...