如何检查财产是不是有任何关系?

Posted

技术标签:

【中文标题】如何检查财产是不是有任何关系?【英文标题】:How To Check If Property Has Any Relationships?如何检查财产是否有任何关系? 【发布时间】:2011-06-03 02:11:41 【问题描述】:

我有一个实体Session。在我看来,实体Exercise 可以添加到Session

在我保存之前,我想检查一下是否与Session有任何关系,如果没有,我会在保存之前删除该对象。

谁能告诉我怎么做?

编辑:

- (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];

【问题讨论】:

澄清:您的意思是即使已经存在一个新的 Session 对象(在第一个 if 块中)总是在创建?你应该解释你期望发生的事情,然后解释实际发生的事情。我们不知道这段代码应该做什么。 对不起,让我解释一下。因此,首先 if 块检查 Session 是否存在,如果存在,则获取它,否则创建它。在所有代码的结尾,我想检查特定的Session 是否有任何exercise 对象,时间戳为今天的日期。 【参考方案1】:

编辑多么不清楚的问题......!下次请先贴代码。

您的NSPredicate 可能有误,试试这个:

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

ENDOFEDIT


只需获取对象以确保它存在与否。

如果你的关系是Session 1-&gt;n Exercise,那么你应该有一个像myExercise.session 这样的反向关系,以便轻松检查(获取)。或者你可以直接使用NSFetchRequest...

另请注意,CoreData 中有“级联”删除工具,但我怀疑它对您的(子实体)情况是否有帮助。

没有更多的代码/细节,很难弄清楚您的问题是什么以及如何解决它。

【讨论】:

亲爱的文森特,我已在问题中添加了我的代码。我在这里面临的问题是,每次加载视图时,我都会为今天的日期获取一个空白的 Session 对象。这就是我想要摆脱的。 不幸的是,我遇到了同样的问题,即为今天的日期创建一个会话以及手动选择日期的正确会话。

以上是关于如何检查财产是不是有任何关系?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据 - 如何在不触发错误的情况下检查对象关系是不是存在

如何检查关系是不是已建立 - Core Data

JDBC / MySQL:如何在创建数据库或关系时检查数据库或关系是不是存在,如果存在则打印错误

SRRS如何检查数据集中是不是存在某个值

Rails,Ransack:如何在 HABTM 关系中搜索“所有”匹配项而不是“任何”匹配项

检查 belongsToMany 关系是不是存在 - Laravel