无法判断获取或关系是不是是问题

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.selectedSessionSession 的一个实例。如果是这种情况,您可以获得该会话的所有练习,如下所示(假设关系称为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 中的最后一行的赋值是向后的。

以上是关于无法判断获取或关系是不是是问题的主要内容,如果未能解决你的问题,请参考以下文章

您如何判断是不是使异常检查或未检查?

用JAVA判断是不是是闰年

获取对象时无法访问一对多CoreData关系

什么是概念,判断和推理

如何判断应用程序是不是为 MFC 程序?

什么是线性回归模型