2013-09-21 2 views
0

Я пытаюсь группировать и подсчитывать дату на основном объекте данных. поскольку дата не может быть группой из-за разного времени. поэтому я пытаюсь передать пользовательскую функцию для nsexpression. но я получаю некоторые ошибки, я не знаю, что это правильный способ сделать это.nsexpression с данными основного ядра функции

код для группировки и подсчета:

NSEntityDescription *entity  = [NSEntityDescription entityForName:@"TEvents" 
               inManagedObjectContext:context]; 
NSDictionary *props = [entity propertiesByName]; 

NSPropertyDescription *propDesc3 = [props objectForKey:@"startDateTime"]; 
NSExpression *propExpr3 = [NSExpression expressionForKeyPath:@"startDateTime"]; 
NSExpression *countExpr3 = [NSExpression expressionForFunction:propExpr3 selectorName:@"dateShort" arguments:nil]; 
NSExpressionDescription *exprDesc3 = [[NSExpressionDescription alloc] init]; 
[exprDesc3 setExpression:countExpr3]; 
[exprDesc3 setExpressionResultType:NSDateAttributeType]; 
[exprDesc3 setName:@"dateStart"]; 


NSFetchRequest *fr = [NSFetchRequest fetchRequestWithEntityName:@"TEvents"]; 
[fr setPropertiesToGroupBy:[NSArray arrayWithObjects:propDesc3, nil]]; 
[fr setPropertiesToFetch:[NSArray arrayWithObjects:propDesc3, exprDesc3, nil]]; 
[fr setResultType:NSDictionaryResultType]; 
NSError * error = nil; 
NSArray *results = [context executeFetchRequest:fr error:&error]; 

dateShort является NSDate функция категория, которая преобразует datatime в текущей зоне пользователя:

-(NSString *) dateShort 
{ 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setCalendar:[NSCalendar currentCalendar]]; 
[formatter setTimeZone:[NSTimeZone localTimeZone]]; 
[formatter setDoesRelativeDateFormatting:YES]; 
[formatter setDateStyle:NSDateFormatterShortStyle]; 
[formatter setTimeStyle:NSDateFormatterNoStyle]; 

NSString *tmpValue = [formatter stringFromDate:self]; 
return tmpValue; 
} 

ошибка:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unsupported function type passed to SQL store'

, как достичь эта цель: конвертировать datetime в текущую зону и группу и рассчитывать на (yy-mm-dd) на базе данных ность?

ответ

0

Я должен был использовать NSExpression для достижения цели. NSfetchResultController не может группироваться.

+0

Пожалуйста, объясните, как вы его достигли. – Krishnan

+0

NSFetchRequest имеет хорошие свойства «propertiesToFetch» ​​и «propertiesToGroupBy». поэтому в основном создайте массив типа NSPropertyDescription, указывающий на столбец. вы можете комбинировать NSPropertyDescription с NSExpression с функциями агрегации. –

0

Я думаю, что вы на неправильном пути здесь. Существует гораздо более простое решение вашей проблемы.

Вы должны использовать NSFetchedResultsController и использовать свойство переходного процесса на своей сущности для использования в качестве заголовка раздела. Вы вычисляете дату в категории подкласса управляемого объекта. Тогда это так же просто, как указать ваше имя свойства переходного процесса в sectionNameKeyPath при создании контроллера получаемых результатов.

У Apple есть хорошая работа example, которая для большинства целей вы можете использовать из коробки.

+0

У меня сейчас есть nsfetchedresultcontroller с переходным свойством cor, преобразующим дату UTC. это прекрасно работает. кроме того, мне приходится группироваться и рассчитывать на более чем одно имущество. и я должен уведомить fetchedresultcontroller изменений, когда фоновый контекст добавляет записи, а затем перегруппируется и пересчитывается. Я борюсь с этим. Я собираюсь взглянуть на связанный пример. –

+0

Пример яблока очень прост и подходит для преобразования даты. мне действительно нужно знать, как объединить все эти трюки. сначала конвертировать dateTime, затем group & count на дату и тип события. и все еще иметь возможность иметь отношения «один ко многим». так что в подробном представлении может отображаться не только сгруппированное событие, но и информация из отношения. –

+0

Это кажется тривиальным. Можете ли вы объяснить на простом английском языке логику, которую вы хотите реализовать? – Mundi

Смежные вопросы