获取一对一关系实体的属性?

时间:2014-02-24 07:22:17

标签: ios core-data entity-relationship one-to-one

我无法获取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 EntityWorkout 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.但我保存得正确吗?。

1 个答案:

答案 0 :(得分:1)

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

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