gpt4 book ai didi

ios - 如何在复杂的 Core Data 模型中高效访问数据

转载 作者:行者123 更新时间:2023-12-01 18:59:56 24 4
gpt4 key购买 nike

我的 Xcode 项目中有一个非常复杂的核心数据模型。为简单起见,我在这里只说我的模型包括与 Teams 有一对多关系的 Games,每个 Teams 与 Players 有一对多关系。所有这三个实体也都有自己的属性(例如,gameLocation、teamScore、playerNumber 等)。

由于 Restkit 向 Ruby on Rails 构建的网站发出的大量 GET 请求,我的数据库已完全填充。所以现在,我想开始处理这些数据——显示和修改它。我知道这涉及获取请求和谓词,但我不知道何时何地需要执行这些获取。我可以获取一个游戏,然后从该游戏访问与该游戏相关的所有内容吗?例如,这是我获取今天安排的所有游戏的代码:

NSFetchRequest *request = [[NSFetchRequest alloc] init];

NSEntityDescription *desc = [NSEntityDescription entityForName:@"Game" inManagedObjectContext:self.managedObjectContext];
[request setEntity:desc];

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"time" ascending:YES];
[request setSortDescriptors:@[sort]];

/*** some code that determines the values for variables 'todaysDate' and 'tomorrowsDate' ***/

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date < %@)", todaysDate, tomorrowsDate];
[request setPredicate:predicate];

NSError *error = nil;
self.games = [self.managedObjectContext executeFetchRequest:request error:&error];

但现在呢?访问这些游戏的团队的最佳方式是什么?我需要更多的获取请求还是效率低下?我试过这样的东西,但它似乎不正确
Game *game1 = [self.games objectAtIndex:0];
NSMutableSet *game1Teams = [game1 mutableSetValueForKey:@"gameTeams"];

不仅是球队,我如何获得这些比赛球队的分数?那些游戏的玩家? ETC...

(也许引用教程或一些示例代码对我来说是个好地方,因为我确信这是微不足道的东西)

最佳答案

关键短语是这样的:

“我可以获取一个游戏,然后从该游戏中访问与该游戏相关的所有内容吗?”

答案是"is"。

您可以基于单个获取请求遍历整个“树”,只需引用指向在您的实体中定义的集合(或其他任何内容)的指针,并允许 Core Data 在需要加载各种实体时进行处理。

一开始这对我来说毫无意义,但是当我放弃战斗时,我发现它比我想象的要容易得多。

这是来自我的一个项目:

@property (nonatomic, retain) NSString * goalName;
@property (nonatomic, retain) NSData * goalPicture;
@property (nonatomic, retain) NSNumber * indexOrder;
@property (nonatomic, retain) NSNumber * wordPicture;
@property (nonatomic, retain) NSSet *item;
@property (nonatomic, retain) User *user;
@property (nonatomic, retain) NSSet *video;

在我的例子中,用户是树中的顶级节点,每个目标下可以有多个项目以及多个视频。

一旦我为给定的用户完成了获取请求,我就可以使用用户实体中的 NSSet 访问该用户的目标。所以,我得到了一组目标:
NSSet *goals = userObj.goal;
Goal *g = [goals anyObject]; // for example.

然后,如果我希望在给定目标中“包含”这些项目:
NSSet *items = g.items;
Item *i = [items anyObject];

等等。重要的是核心数据将有效地加载实体。如果您有 10,000 个项目附加到一个特定目标,那么您不必担心那些在真正需要它们之前会被获取......

关于ios - 如何在复杂的 Core Data 模型中高效访问数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23506579/

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