3

シナリオ:

私はiOSアプリケーションを追跡する経費を持っており、「DashBoardViewController」(テーブルビューコントローラー-FRC付き)と呼ばれるビューコントローラーを持っています。これは基本的に、特定の週、月、または年の経費/収入を分類し、セクションヘッダーとして表示しますたとえば、タイトル:(2012年10月1日から10月7日)。特定の週、月、または年に応じて、費用/収入のROWSおよび関連するものが表示されます。

私の質問:

私が達成したいのは:

3つの異なる日付(それぞれ2012年11月11日、11月14日、11月16日)に「自動」という名前の同じカテゴリで3つの新しい経費を節約するとします。

ビューコントローラで、そのカテゴリ「自動」をテーブルビューの行として表示したいのですが、3つの経費を節約したので(カテゴリ「自動」で)、合計金額は3回ではなく、1行としてのみ表示されます。私が節約した3つの費用すべてを合計しました(その特定のカテゴリーについて)。次のスクリーンショットのようなもの。

ここに画像の説明を入力してください

私は、実際に必要なものではなく、同じカテゴリの3つの行(同じカテゴリの1つの行)を提供するコードビットをいくつか作成しましたが、それらの合計をどのように計算するかわかりませんか?ここでNSPredicateまたはフェッチされた結果コントローラーに関連するものである必要があります。どんな助けでも大歓迎です。

- (void)userDidSelectStartDate:(NSDate *)startDate andEndDate:(NSDate *)endDate
{
    AppDelegate * applicationDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext * context = [applicationDelegate managedObjectContext];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
  // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Money" inManagedObjectContext:context];
   [fetchRequest setEntity:entity];

  // Set the batch size to a suitable number.
   [fetchRequest setFetchBatchSize:20];

   NSPredicate *predicateDate = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date <= %@)", startDate, endDate];

// Edit the sort key as appropriate.

  typeSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"type" ascending:YES]; // type refers to an expense or income.

  dateSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];

  if(self.choiceSegmentedControl.selectedIndex == 0)  // UISegment Control for "Sorting Category"
  {
      NSPredicate *predicateCategory = [NSPredicate predicateWithFormat:@"cat == %@", @""];
                
      NSArray * subPredicates = [NSArray arrayWithObjects:predicateCategory, predicateDate, nil];
    
      NSPredicate * compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates];
    
      [fetchRequest setPredicate:compoundPredicate];

      choiceSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"cat" ascending:NO];
   }

   NSArray * descriptors = [NSArray arrayWithObjects:typeSortDescriptor, dateSortDescriptor, choiceSortDescriptor, nil];

   [fetchRequest setSortDescriptors:descriptors];
   [fetchRequest setIncludesSubentities:YES];

   
   if(_fetchedResultsController)
   {
       [_fetchedResultsController release]; _fetchedResultsController = nil;
    
   }

   // Edit the section name key path and cache name if appropriate.
   // nil for section name key path means "no sections".
  _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"type" cacheName:nil];

  _fetchedResultsController.delegate = self;

  NSError *anyError = nil;

  if(![_fetchedResultsController performFetch:&anyError])
  {
      NSLog(@"error fetching:%@", anyError);
  }

  __block double totalAmount = 0;

  [[self.fetchedResultsController fetchedObjects] enumerateObjectsUsingBlock: ^void (Money *money, NSUInteger idx, BOOL *stop) {
    
    totalAmount += [[money amount] doubleValue];
  }];

  [fetchRequest release];

  //Finally you tell the tableView to reload it's data, it will then ask your NEW FRC for the new data
  [self.dashBoardTblView reloadData];

  self.startDate = startDate;
  self.endDate = endDate;

}

NSDictionaryResultTypeを使用することを考えましたが、これにより、使用したFRCに問題が発生します(セクション名、テーブルビューの入力など)

FRCをループするコードは、(収入と支出の)合計金額を示しますが、各カテゴリの合計金額が必要です(例:カテゴリ「自動」の合計、カテゴリ「エンターテインメント」の合計)。私を助けてください、私はここで完全に立ち往生しています。

4

1 に答える 1

0

必要な種類のオブジェクトを返すように FRC をマッサージすることはできないと思います。NSPredicate は、返すオブジェクトの種類をフィルタリングするだけで、データから新しいオブジェクトを作成しません。

ただし、日付でフィルター処理されたお金のオブジェクトをフェッチし、次のようにKVC コレクション オペレーターを使用してお金のオブジェクトの配列からデータを計算できます。

NSArray *moneyObjectsFilteredbyDate = [self.fetchedResultsController fetchedObjects]
NSArray *categoryStrings = [moneyObjectsFilteredbyDate valueForKeyPath:@"@distinctUnionOfObjects.cat"];
NSArray *sortedCategoryStrings = [categoryStrings sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

NSMutableArray *aggregatedDataObjects = [NSMutableArray array];
for (NSString *aCategoryString in sortedCategoryStrings) {
    NSPredictate *categoryPredicate = [NSPredicate predicateWithFormat:@"cat == %@", aCategoryString];
    NSArray *moneyWithThisCategory  = [moneyObjectsFilteredByDate filteredArrayUsingPredicate:categoryPredicate];
    NSNumber *sum = [moneyWithThisCategory valueForKeyPath:@"@sum.amount"];
    [aggregatedDataObjects addObject:@{@"category" : aCategoryString, @"sum" : sum, @"individualExpenses" : moneyWithThisCategory}];
} 

もちろん、表のセルを構成するメソッドの一部を実行することもできますが (合計自体の計算など)、アイデアが得られることを願っています。しかし、述語を SQL クエリなどの形式で使用して、新しいデータ構造を作成することはできないと思います。

他にできること: カテゴリを Core Data モデルの個々のオブジェクトにし、moneyobjects と Category オブジェクトの間の関係を追加します。次に、カテゴリ オブジェクトを取得するだけです。ただし、カテゴリの費用を日付でフィルター処理する必要があります。

于 2013-01-10T21:23:20.943 に答える