我无法获取1-1关系实体属性的结果?
背景信息
我有三个UITableViewController
,祖父TVC有10个细胞,第1天,第2天......第10天。父亲TVC有3个细胞,锻炼1,锻炼2,锻炼3.在孩子身上TVC我设置了每个锻炼的属性及其“锻炼评分”。所以每天Cell都有3个运动细胞。
Workout1,Workout2,Workout3各有一个workoutscore attribute
。我想在锻炼单元上显示锻炼分数。
所以我有Day Entity
one-one relationship
Workout1 Entity
Workout2 Entity
和Workout 3 Entity
。
Day <---> Workout1 Day<----->Workout2 Day<---->Workout3
从孩子到父母的后退导航后,我正确传递锻炼分数并将上下文保存在父级中。 WorkOut单元格上的标签正确显示锻炼分数。
当然,当我导航回到祖父TVC并回到父母TVC deallocs
的父母那里时,我想根据祖父TVC的日子取得之前的分数。
SAVING 出现在 VIEWDIDAPPEAR (这是正确的)
在父级TVC 中(注意:我只显示一个训练的代码,因为它与其他2个相同)
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];
}
FETCHING 出现在 VIEWDIDLOAD (这是不正确的,有些东西在这里不起作用)
在父级TVC 中(注意:我只显示一个训练的代码,因为它与其他2个相同)
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.但我保存得正确吗?。
答案 0 :(得分:1)
你这里有很多问题,很难指出正确的方向。
insertNewObjectForEntityForName:inManagedObjectContext:
时,你正在向上下文引入一个新对象。这意味着在您当前状态下,您在“父TVC”的每个Day
调用中插入空WorkoutX
和viewDidLoad
。这也发生在您的viewDidAppear
中,但您可以为插入的对象设置值。Day
。objectID
发送给“父级TVC”,您的获取请求可能会更加简单,您的谓词将是:[NSPredicate predicateWithFormat:@"day = %@",dayObjectID]
Workout
实体拆分为3个独立的实体?您可以在Workout
实体中拥有单个Day
实体和3对一关系(如果您希望进行可变数量的锻炼,则可以是多对多关系)。