2009-08-11 2 views
2

私のコアデータモデルでは、日付属性を持つエンティティがあります。タイトルに示すように、このエンティティを(週)日単位でグループ化したいと思います。平日のコアデータでのグループ化

問題は、日付がタイムスタンプとして多かれ少なかれ格納されているため、私のエンティティを適切にグループ化/フィルタリングできる述語を作成する方法がわかりません。

私はおそらく毎日のフェッチをしなければならないとわかったので、以下の方法で作成しました。 コードは私の助けが必要でした。

- (NSFetchedResultsController *)fetchedResultsController:(NSDate *)day { 
if(fetchedResultsController != nil) 
    return fetchedResultsController; 

// Create and Configure Request 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext]; 
[request setEntity:entity]; 

// Predicate 
// pseudo code where i'm clueless is marked by "<" and ">" - start 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"DateAttribute BETWEEN <first second of day> AND <last second of day>"]; 
// or 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"<dayofmonth-month-year of DateAttribute> LIKE <dayofmonth-month-year of day>"]; 
[request setPredicate:predicate]; 
// pseudo code where i'm clueless is marked by "<" and ">" - end 

// Sort descriptors 
NSSortDescriptor *titleDescriptor = [[NSSortDescriptor alloc] initWithKey:sortDescriptorName ascending:YES]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:titleDescriptor]; 
[request setSortDescriptors:sortDescriptors]; 

// create and init fetchResultsController 
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"]; 
self.fetchedResultsController = aFetchedResultsController; 
fetchedResultsController.delegate = self; 

//Memory 
[request release]; 
[titleDescriptor release]; 
[aFetchedResultsController release]; 

return fetchedResultsController; 

}

私は本当に任意の助けをいただければと思います。ありがとう

答えて

5

曜日別にグループ化する場合、最も簡単なことは、エンティティに「平日」などの属性を追加することです。 NSFetchedResultsControllerを初期化するときにsectionNameKeyPath引数として "平日"を渡します。この場合、述語を指定する必要はありません。平日のセクションが自動的に取得されます。

日単位でグループ化する場合は、NSFetchedResultsControllerを初期化するときに、sectionNameKeyPath引数としてDateAttributeを渡します。繰り返しますが、述語を指定する必要はありません。その日のセクションが自動的に取得されます。

コードで実行しようとしていることは、求めているものと異なります。実際には、セクションを取り戻そうとしているわけではありません。つまり、特定の述語を満たすエンティティによって記述されたオブジェクトを含むtableViewの単一のセクションを取得しようとしています。つまり、DateAttributeが(おそらく、 )となります。この述語はまさにそのDateAttribute現在の日内にあるすべてのオブジェクトを取得します

// start by retrieving day, weekday, month and year components for today 
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *todayComponents = [gregorian components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:[NSDate date]]; 
NSInteger theDay = [todayComponents day]; 
NSInteger theMonth = [todayComponents month]; 
NSInteger theYear = [todayComponents year]; 

// now build a NSDate object for the input date using these components 
NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setDay:theDay]; 
[components setMonth:theMonth]; 
[components setYear:theYear]; 
NSDate *thisDate = [gregorian dateFromComponents:components]; 
[components release]; 


// now build a NSDate object for tomorrow 
NSDateComponents *offsetComponents = [[NSDateComponents alloc] init]; 
[offsetComponents setDay:1]; 
NSDate *nextDate = [gregorian dateByAddingComponents:offsetComponents toDate:thisDate options:0]; 
[offsetComponents release]; 

NSDateComponents *tomorrowComponents = [gregorian components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:nextDate]; 
NSInteger tomorrowDay = [tomorrowComponents day]; 
NSInteger tomorrowMonth = [tomorrowComponents month]; 
NSInteger tomorrowYear = [tomorrowComponents year]; 

[gregorian release]; 


// now build the predicate needed to fetch the information 
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"DateAttribute < %@ && DateAttribute > %@", nextDate, thisDate]; 

:これを実現するには、次のコードを使用することができます。お役に立てれば。

+0

あなたの包括的な回答に感謝します。 "NSFetchedResultsControllerを初期化するときに、日ごとにグループ化したい場合は、NSFetchedResultsControllerを初期化するときに、DateAttributeをsectionNameKeyPath引数として渡します。この場合も、述語を指定する必要はありません。 それがうまくいけば、そうするとDateAttributeの値でグループ分けされます(時間が含まれています、例えば "2009-07-02 20:51:27 -0400") p.s.私の究極の目標は、平日のリストを取得し、そのうちの1つをクリックすると、その日に接続されたすべてのエンティティが別のテーブルビューで開きます。 – gabtub

+0

これは、私のサンプルコードで示したのと同じテクニックを使用して、時間なしでDateAttributeをエンティティに格納することで実現できます。NSDateオブジェクト(DateAttribute)から始めて、まず日付コンポーネントを抽出してから、これらのコンポーネント(したがって、時間は含まれません)。あなたのエンティティに格納するのは、この最後のNSDateオブジェクトです。そして、その日に基づいてオブジェクトを検索することは、説明したように動作します。 –

+0

最初はデータモデルを変更したくないのですが、それは他の誰かによって指定されていたからです。しかし、幸いにも時刻と日付を格納する必要はありませんでしたが、 >作品 ありがとう! – gabtub

4

こんにちは@ 私は実際にあなたの質問を見ていました。私は同じ種類の質問をしていました。 私がしたかったのは、私のテーブルを日付でセクションに分割し、私が言いましたようにタイムスタンプではないことでした。だから私は(私がフェッチ午前実体である)NSManagedObjectを拡張する私のクラスに新たなメソッドを追加したものをそのメソッドは、次のようなフォーマットされた日付を返します。

- (NSString *)transactionDay{ 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
return [dateFormatter stringFromDate:self.date];} 

はその後であることを私のfetchedResultControllerを変更しました
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"transactionDay" cacheName:nil]; 

すべてが魅力的でした。

詳細を表示するには、リンクをクリックしてください。 http://www.IPHONE4GAPP.NET/superdb-core-data-app-with-sections.html

+0

興味深い、ありがとう! – gabtub

+0

dateFormatterを解放することを忘れないでください。 –

関連する問題