获取关系并显示在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。
另一个答案是如何做取得的结果控制器。