gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:13:23 28 4
gpt4 key购买 nike

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

背景信息

我有三个 UITableViewController,祖父 TVC 有 10 个单元格,第 1 天、第 2 天...第 10 天。父亲 TVC 有 3 个单元格,锻炼 1、锻炼 2、锻炼 3。并且在子 TVC 中,我设置了每次锻炼的属性及其“workoutscore”。所以每天 Cell 在 segue 之后都有 3 个 workoutcells。

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

所以我有一个 Day Entity,它与 Workout1 EntityWorkout2 Entity 具有一对一关系,并且锻炼 3 实体

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

最佳答案

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

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

关于ios - 获取一对一关系实体的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21981336/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com