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