获取关系并显示在UITableView中

我在我的购物车应用程序中的Core Data模型中设置了以下关系。

Menu – >> Product << – Cart (见下图)。

在这里输入图像说明

还有一个Objective-C类别,其代码如下:

 + (Cart *)addProductToCartWithProduct:(Product *)product inManagedObjectContext:(NSManagedObjectContext *)context { Cart *cart = [NSEntityDescription insertNewObjectForEntityForName:@"Cart" inManagedObjectContext:context]; NSManagedObjectID *retID = [product objectID]; [(Product *)[context objectWithID:retID] setInCart:cart]; [cart addProductsObject:(Product *)[context objectWithID:retID]]; return cart; } 

当用户按下应用程序中的“添加到购物车”button时,该方法被触发(上述方法)。 我现在想把这些产品(由用户添加到购物车),在我的其他类中,“购物车”所在的位置。 我希望这些产品能够在我的UITableView中显示,因此我使用FRC。 但我不知道如何取得关系,从而显示产品。 我将如何设法做到这一点?

我现在有下面的代码。

 - (void)loadCart { NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; fetchRequest.entity = [NSEntityDescription entityForName:@"Cart" inManagedObjectContext:_theManagedObjectContext]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:YES]; fetchRequest.sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; [NSFetchedResultsController deleteCacheWithName:@"cartproducts"]; self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_theManagedObjectContext sectionNameKeyPath:nil cacheName:@"cartproducts"]; _fetchedResultsController.delegate = self; NSError *error = nil; if (![_fetchedResultsController performFetch:&error]) { NSLog(@"Fetch Failed"); } } 

我的UITableview cellForRowAtIndexPath:方法。

 - (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *plainCellIdentifier = @"OrderCell"; ProductsCell *cell = (ProductsCell *)[aTableView dequeueReusableCellWithIdentifier:plainCellIdentifier]; if (!cell) { cell = [[ProductsCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:plainCellIdentifier]; } Cart *ret = (Cart *)[self.fetchedResultsController objectAtIndexPath:indexPath]; // How to show the product names using the relationship? cell.title = ret.products ??; [cell setNeedsDisplay]; return cell; } 

要显示一个特定购物车的产品,您可以按如下方式创build提取的结果控制器(不检查编译器,可能会出现语法错误!)

 Cart *theCart = ... the cart that you want display products for ... // Fetch request for "Product": NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Product"]; // Fetch only products for the cart: NSPredicate *predicate = [NSPredicate predicateWithFormat:@"inCart = %@", theCart]; [fetchRequest setPredicate] = predicate; // Assuming that you want to sort by "navn": NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"navn" ascending:YES]; [fetchRequest setSortDescriptors:@[sortDescriptor]]; self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_theManagedObjectContext sectionNameKeyPath:nil cacheName:nil]; _fetchedResultsController.delegate = self; 

获取的对象现在是Product对象,因此在cellForRowAtIndexPath:例如:

 ... Product *product = [self.fetchedResultsController objectAtIndexPath:indexPath]; cell.title = product.navn; 

备注:获取的结果控制器仅在段信息中使用caching(据我所知),所以不需要指定cacheName: here。

我认为你的新模式是好的。

现在,我更好地理解你的方法,我认为你需要做一个像你原来的代码一样的提取。 我错误地认为你想要有多个购物车 – 我想我就像一个服务器工程师。

 + (Cart *)addProductToCart:(Product *)theProduct inManagedObjectContext:(NSManagedObjectContext *)context { Cart *cart = nil; NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Cart"]; NSError *error = nil; NSArray *carts = [context executeFetchRequest:request error:&error]; if (!carts || ([carts count] > 1)) { // handle error } else if (![carts count]) { cart = [NSEntityDescription insertNewObjectForEntityForName:@"Cart" inManagedObjectContext:context]; } else { // they already have a cart started cart = [carts lastObject]; } [cart addProductsObject:theProduct]; return cart; } 

你不需要这个: NSManagedObjectID *retID = [product objectID]; 。 只需通过Product对象来引用产品。 在这种情况下,您不需要通过其ID进行往返。

你不需要这个: [(Product *)[context objectWithID:retID] setInCart:cart]; 。 反向configuration正确后,将产品添加到购物车中会自动设置Product.inCart。

另一个答案是如何做取得的结果控制器。