无法判断获取或关系是不是是问题
Posted
技术标签:
【中文标题】无法判断获取或关系是不是是问题【英文标题】:Can't Tell If Fetch Or Relationship Is The Problem无法判断获取或关系是否是问题 【发布时间】:2011-05-30 20:57:18 【问题描述】:我正在向对象会话添加对象练习(作为关系)。
在视图中,我想获取并显示特定会话对象的练习。
现在它显示了数据库中的所有练习,而不仅仅是那个会话对象。
两个对象之间的关系称为“练习”。
如果有人可以帮助我,这是我用于获取的当前代码。
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Exercise" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
LogResultsViewController *logResultsTableViewController = [[LogResultsViewController alloc]init];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat: @"exercises = %@", logResultsTableViewController.selectedSession]];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
更新代码:
- (void) viewDidLoad
NSSet *exercises = [self.selectedSession valueForKey:@"exercises"];
NSArray *sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"timeStamp" ascending:YES]];
NSArray *sorted = [exercises sortedArrayUsingDescriptors:sortDescriptors];
sorted = self.exerciseArray;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [exerciseArray count];
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.textLabel.text = [exerciseArray objectAtIndex:indexPath.row];
return cell;
当我对 selectedSession 进行 NSLog 记录时,它会显示以下内容:
selectedSession: <Session: 0x7336940> (entity: Session; id: 0x7334f70 <x-coredata://17D44726-23F7-402F-9CBE-2EED96212E14/Session/p1> ; data:
exercises = "<relationship fault: 0x5d34680 'exercises'>";
timeStamp = "2011-05-31 04:41:07 +0000";
另外,当我 NSLog 称为练习的 NSSset 时,我得到:
Relationship fault for (<NSRelationshipDescription: 0x711b370>), name exercises, isOptional 1, isTransient 0, entity Session, renamingIdentifier exercises, validation predicates (
), warnings (
), versionHashModifier (null), destination entity Exercise, inverseRelationship exercises, minCount 0, maxCount 0 on 0x7140790
更新:
好的,所以我将 cellForRowAtIndex 中的代码更改为
Exercise *exercise = (Exercise *)[exerciseArray objectAtIndex:indexPath.row];
cell.textLabel.text = exercise.name;
现在它显示了练习名称,但它为所有课程显示了相同的练习列表,而不仅仅是它所属的课程。
【问题讨论】:
【参考方案1】:如果您的 Session
实例与 Exercise
实例有关系,则无需再进行一次提取来获取会话的练习。您可以按照关系直接获取它们——它们会自动加载。从您的代码看来,logResultsTableViewController.selectedSession
是Session
的一个实例。如果是这种情况,您可以获得该会话的所有练习,如下所示(假设关系称为exercises
):
NSSet *exercises = [logResultsTableViewController.selectedSession valueForKey:@"exercises"];
然后您可以根据需要对该 NSSet 进行排序。
【讨论】:
谢谢汤姆,我认为这正是我所需要的。如果我这样做,我是否应该从这个 NSSet 创建一个 NSArray,类似于[[NSMutableArray alloc] initWithArray:[inSet allObjects]];
?另外,如果我这样做,我可以在这个视图中摆脱所有与 fetchresults 相关的代码吗?如果我想从此视图中删除锻炼实例怎么办?
嗯,[inSet allObjects]
已经是一个数组,所以不需要其余的,除非您需要数组是可变的。查看上面的代码,您可以执行NSArray *sorted = [inSet sortedArrayUsingDescriptors:sortDescriptors]
之类的操作。
好吧,我现在就试试这个。我可以从这个 viewController 中删除所有与 fetchresults 相关的代码,对吗?但是,如果我想删除一个练习实例怎么办?我还能这样做吗?
如果您可以查看,我还将我的新代码添加到问题中。该表没有显示任何数据。我不确定这段代码是否有问题,或者是否没有正确地将练习实例添加到会话中。
要回答第一条评论,如果您要删除条目,那么您确实需要转换为可变数组。对于第二个问题,您的表格视图回调使用了exerciseArray
,但没有迹象表明您曾经为该变量分配过任何数据。因此,该表没有要显示的数据。看起来viewDidLoad
中的最后一行的赋值是向后的。以上是关于无法判断获取或关系是不是是问题的主要内容,如果未能解决你的问题,请参考以下文章