2

我在我的购物车应用程序中的核心数据模型中设置了以下关系。

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;
}

当用户在应用程序中按下“添加到购物车”按钮时,会触发此方法(上述方法)。我现在想在“购物车”所在的其他类中获取这些产品(由用户添加到购物车中)。我希望这些产品在我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;
}
4

2 回答 2

2

要显示特定购物车的产品,您可以按如下方式创建 fetched results 控制器(未经编译器检查,可能存在语法错误!)

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;  

备注: fetched results controller 只对部分信息使用缓存(据我所知),所以这里不需要指定cacheName:

于 2013-06-02T16:43:33.970 回答
1

我认为你的新模型很好。

现在我更好地理解了您的方法,我认为您确实需要进行类似于原始代码的获取。我错误地认为您想要拥有多个购物车 - 我想我想像一个服务器工程师。

+ (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];。正确配置逆序后,将产品添加到购物车会自动设置 theProduct.inCart。

另一个答案适用于如何执行获取的结果控制器。

于 2013-06-02T18:15:55.663 回答