我无法获取1-1关系实体的属性的结果?

背景信息

我有3个UITableViewController,祖辈TVC有10个单元格,第1天,第2天。第10天。父亲TVC有3个单元格,锻炼1,锻炼2,锻炼3。在子TVC中,我设置了属性每个锻炼及其“锻炼成绩”。因此,每天在关押之后,Cell都会有3个健身室。

锻炼1,锻炼2,锻炼3每个都有一个workoutscore attribute。我想在锻炼单元格上显示锻炼分数。

因此,我有一个Day Entity和一个one-one relationship,其中的Workout1 EntityWorkout2 EntityWorkout 3 Entity

Day <---> Workout1       Day<----->Workout2     Day<---->Workout3


从孩子向父母的向后导航后,我正确地传递了trainingscores并将上下文保存在父母中。锻炼单元格上的标签正确显示了运动得分。

当然,当我导航回祖父TVC并返回父TVC deallocs时,我想获取基于祖父TVC日的以前的分数。

在VIEWDIDAPPEAR中保存显示(正确)

在父TVC中(注意:我只显示一种锻炼的代码,因为其他两种锻炼是相同的)

AppDelegate *ad = [[UIApplication sharedApplication] delegate];

Day *myDay = [NSEntityDescription insertNewObjectForEntityForName:@"Day"
                                                     inManagedObjectContext:ad.managedObjectContext];

Workout1 *myWorkout1 = [NSEntityDescription insertNewObjectForEntityForName:@"Workout1"
                                                           inManagedObjectContext:ad.managedObjectContext];

NSNumber *theNumber = myWorkout1.workoutscore; //get old score
theNumber = [self updateNumber:theNumber forIndex: 11];
myWorkout1.workoutscore = theNumber; //update for new score
[myDay setWorkout1:myWorkout1]; //set Workout Entity to day Entity

NSError *savingError = nil;
myDay.dayname = [NSString stringWithString:self.dayname];
[ad.managedObjectContext save:&savingError];
}


正在以VIEWDIDLOAD的形式出现(这是不正确的,此处不起作用)

在父TVC中(注意:我只显示一种锻炼的代码,因为其他两种锻炼是相同的)

     AppDelegate *ad = [[UIApplication sharedApplication] delegate];

Day *day = [NSEntityDescription insertNewObjectForEntityForName:@"Day"
                                           inManagedObjectContext:ad.managedObjectContext];

Workout1 *myWorkout1 = [NSEntityDescription insertNewObjectForEntityForName:@"Workout1"
                                                           inManagedObjectContext:ad.managedObjectContext];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Workout1" inManagedObjectContext:ad.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects:@"Day",nil]];
[fetchRequest setIncludesSubentities:YES];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"day.daynumber contains %@", self.dayLabel.text]; //self.dayLabel.text is Day# in string form.
[fetchRequest setPredicate:predicate];

NSError *error = nil;

NSArray *fetchedObjects = [ad.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
    NSLog(@"Nothing was fetched");
}
NSLog(@"number of fetched objects is %lu", (unsigned long)[fetchedObjects count]);

myWorkout1 = [fetchedObjects lastObject]; //most recent update of score

if ([fetchedObjects count] > 0) {
       stringWS1 = [[NSMutableString alloc] init];
       stringWS1 = [NSMutableString stringWithFormat:@"%@",myWorkout1.workoutscore];
        self.workoutScoreLabel1.text = [NSMutableString stringWithString:stringWS1]; //Put score on label


[fetchedObjects count] > 0的If语句之前,我得到的只是标签上的(null)。现在我什么也没得到,因为数组==0。但是我正确保存了吗?

最佳答案

这里有很多问题,很难指出正确的方向。


CoreData没有用于“创建或更新”的内置方法。当您调用insertNewObjectForEntityForName:inManagedObjectContext:时,您正在向上下文中引入一个新对象。这意味着在当前状态下,您将在“父TVC”的每个Day调用中插入一个空的WorkoutXviewDidLoad。您的viewDidAppear中也会发生这种情况,但是您可以在其中设置插入对象的值。
如果将DayobjectID发送到“父TVC”,则获取请求可能会简单得多,谓词为:[NSPredicate predicateWithFormat:@"day = %@",dayObjectID]
为什么将Workout实体拆分为3个单独的实体?您可以有一个Workout实体,并且在Day实体中有3对1的关系(如果您想进行不同数量的锻炼,则可以是一对多的关系)。
保留对您要更新的内容(天,锻炼)的引用,并直接更新这些对象(只要您仅在主线程上工作,就不需要通过其ID来获取它们)
阅读CoreData文档HERE,特别是有关创建,删除和获取托管对象的信息。
查看一些示例(例如Xcode中的空白CoreData项目),并查看它们如何与对象一起使用。

10-08 05:28