Основной запрос данных, NSPredicate - PullRequest
0 голосов
/ 05 июля 2011

У меня есть объект с именем "Sessions", и он содержит атрибут NSDate.

Я хочу иметь возможность запрашивать базовую модель данных и получать массив ДНЕЙ NSDates без каких-либодубликаты.

Например, если у меня есть 5 сеансов в четверг, 2 в пятницу и 1 в воскресенье, я хочу массив "четверг", "пятница", "воскресенье".

(Это не обязательно должен иметь этот формат строки, ту часть, которую я могу выяснить и изменить самостоятельно.)

Каков был бы правильный подход к этому методу?

Ответы [ 2 ]

0 голосов
/ 05 июля 2011

Я не думаю, что вы можете получить то, что вы хотите, в результате запроса. Вы можете использовать -[NSFetchRequest setReturnsDistinctObject:], чтобы возвращать только результаты с уникальными значениями NSDate, но поскольку вас интересует только день недели, вам может не повезти.

Однако вы можете сохранить день недели в вашей сущности в виде целого числа, а затем искать его.

Вы также можете извлечь все сущности Sessions, а затем создать оттуда словарь дней недели (где массив результатов - это массив, содержащий все ваши выбранные сеансы):

// This date formatter will return a string with the full weekday, i.e. "Monday"
NSDateFormatter *dfText = [[NSDateFormatter alloc] init];
[df setDateFormat:@"EEEE"];

// This date formatter will return a string with the number of the weekday, i.e. "1"
NSDateFormatter *dfNumber = [[NSDateFormatter alloc] init];
[df setDateFormat:@"c"];

NSMutableDictionary *weekdays = [NSMutableDictionary dictionary];

for (Session *curSession in resultsArray) {

    NSString *weekdayNumber = [dfNumber stringFromDate:curSession.Date];

    if (![weekdays objectForKey:weekdayNumber]) {
        [weekdays setObject:[dfText stringFromDate:curSession.Date] forKey:weekdayNumber];
    }

}

[dfText release];
[dfNumber release];
0 голосов
/ 05 июля 2011

Вы не можете.Это не то, для чего NSPredicate.Вам нужно будет выбрать Session объекты, и для каждого из них выяснить, какой сегодня день.Это будет примерно так:

NSArray *sessions = ...; // an array of Session objects
NSMutableSet *days = [NSMutableSet set];
NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"EEEE"]; // this is the name of the day of the week, spelled out
for (Session *session in sessions) {
  NSDate *d = [session date];
  NSString *dayOfWeek = [f stringFromDate:d];
  [days addObject:dayOfWeek];
}
[f release];
NSLog(@"days: %@", days);

Обратите внимание, что поскольку мы используем NSSet, дни недели будут неупорядоченными.

...