2013-06-02 34 views
2

我的購物車應用程序中的Core Data模型中設置了以下關係。獲取關係並在UITableView中顯示

Menu - >>Product < < - Cart(見下圖)。

enter image description here

並用下面的代碼一個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");   
    } 
} 

UITableviewcellForRowAtIndexPath:方法。

- (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; 
} 
+0

所以,你想顯示一個特定購物車的產品? –

+0

是的,我的應用中只有一個購物車。這可能嗎? :) – 7c9d6b001a87e497d6b96fbd4c6fdf

回答

2

要爲一個特定的購物車顯示產品,您將創建所取得的成果控制器 如下(沒有編譯器檢查,可能有語法錯誤!):

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; 

備註:獲取的結果控制器僅在部分信息中使用緩存(據我所知),因此無需在此處指定cacheName:

+0

你在我之前! :) –

+0

非常感謝你:)。我想我誤解了你對上述問題的評論。我沒有購買特定的購物車,只是添加到關係中的所有產品對象,這是否會改變方法?謝謝 :)。 – 7c9d6b001a87e497d6b96fbd4c6fdf

+0

@Seya:對不起,但我不明白你想要什麼。我的代碼顯示與某個特定購物車對象相關的所有產品。這與「添加到關係中的所有產品對象」有何不同? - 還要注意(正如在其他答案中所說的),addProductToCartWithProduct每次調用它時都會創建一個新的Cart對象,這可能不是您想要的。 –

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];。反向配置正確後,將產品添加到購物車中會自動設置Product.inCart。

另一個答案是如何執行提取的結果控制器。

+0

嘿嘿,如果沒有爲產品實體添加屬性,我如何模擬購物車中給定產品的計數?假設購物車需要有3個A,2個B,其中A和B是產品。 – JohnVanDijk