【问题标题】:Fetch an one-one relationship Entity's attribute?获取一对一关系实体的属性?
【发布时间】:2014-03-25 17:40:21
【问题描述】:

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

背景信息

我有三个UITableViewControllers,祖父 TVC 有 10 个单元格,第 1 天,第 2 天..第 10 天。父亲 TVC 有 3 个单元格,锻炼 1,锻炼 2,锻炼 3。而在孩子 TVC I设置每个锻炼的属性及其“workoutscore”。所以每天Cell在segue之后有3个训练单元。

Workout1、Workout2、Workout3 各有一个 workoutscore attribute。我想在锻炼单元格上显示锻炼分数。

所以我有一个Day Entity、一个one-one relationship、一个Workout1 Entity、一个Workout2 EntityWorkout 3 Entity

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

从子级返回到父级后,我正确传递了 workoutscore 并将上下文保存在父级中。 WorkOut 单元格上的标签正确显示workoutscore

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

正在保存出现在 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] &gt; 0 的 If 语句之前,我得到的只是标签上的 (null)。现在我什么也没得到,因为数组 == 0。但我保存正确吗?。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多