Как использовать NSPredicate для получения свойства, имеющего тип NSDate?

У меня есть столбец в core data, в котором хранится дата (eg:2006-01-26). Я использовал массив для хранения всех лет, используя NSDateComponents в этих сохраненных датах (например: в указанную выше дату, если я использую NSDateComponents, я получаю 2006 год как год). Эти годы NSNumbers, и, используя их в моем предикате, я хочу получить столбец NSDate со всеми компонентами даты. И извлекаемые записи должны быть только определенного года. Теперь я не понимаю, как я могу сопоставить компоненты года с одним из компонентов массива и создать предикат.

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSFetchRequest *request = [[NSFetchRequest alloc]init];
    NSError *error;

    //AppDelegate *app = [[UIApplication sharedApplication]delegate];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Movies" inManagedObjectContext:self.managedObjectContxt];
    [request setEntity:entity];


    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] 
                                        initWithKey:@"releaseDate" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor,nil];
    [request setSortDescriptors:sortDescriptors];
    //[request setReturnsDistinctResults:YES ];
   // [request setEntity:entity];
    [sortDescriptors release];
    [sortDescriptor release];

    [request setPropertiesToFetch:[NSArray arrayWithObject:@"releaseDate"]];
    NSMutableArray *arrOfdMovies = [[self.managedObjectContxt executeFetchRequest:request error:&error]mutableCopy];
    [self setArrOfFetchdMovies:arrOfdMovies];


    arrOfDistinctYr = [[NSMutableArray alloc]init];
    NSMutableArray *temp = [[NSMutableArray alloc]init];

    for (int i = 0; i<[arrOfdMovies count]; i++) {
             // NSLog(@"%@",[[arrOfdMovies objectAtIndex:i] valueForKey:@"releaseDate"]);
        //date to its components
        NSDate *now = [[arrOfdMovies objectAtIndex:i]valueForKey:@"releaseDate"];
        // Specify which units we would like to use
        unsigned units = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
        NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
        NSDateComponents *component_s = [calendar components:units fromDate:now];

        NSInteger year = [component_s year];
        NSLog(@"%i", year);
//        NSInteger month = [components month];
//        NSInteger day = [components day];
        NSNumber *num= [NSNumber numberWithInteger:year];
        [temp addObject:num];
    }
    [self setArrOfDistinctYr:temp];

    //distinct value logic.
    NSSet *uniqueYrs = [NSSet setWithArray:arrOfDistinctYr];
    arr = [[NSArray alloc]initWithArray:[uniqueYrs allObjects]];

    //sorting
    NSArray *ar = [arr sortedArrayUsingSelector:@selector(compare:)];
    self.arr = ar;
    [self.managedObjectContxt retain];          
    [request release];


}

массив "ar" содержит только годы в различном и отсортированном виде. Но типы данных элементов этого массива: «NSNumbr». Теперь, как я могу сформировать предикат, который будет использовать этот массив для отображения записей за конкретный год (как проверить год с поля даты основных данных [у которого есть дата: 2006 г.) -01-26]). Я пробовал следующим образом -

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//    return 2;

    NSFetchRequest *requst=[[NSFetchRequest alloc]init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Movies" inManagedObjectContext:self.managedObjectContxt];
    [requst setEntity:entity];
    requst.predicate = [NSPredicate predicateWithFormat:@"releaseDate CONTAINS%@", [arr objectAtIndex:section]];
    NSError *error = nil;
    NSMutableArray *array = [[self.managedObjectContxt executeFetchRequest:requst error:&error]mutableCopy];
    [requst release];
    return [array count];

}

Как только я это получу, я смогу отображать записи в моем viewController.


person PriyankaJ    schedule 04.04.2012    source источник
comment
Я новенький здесь. Подскажите, пожалуйста, как прикрепить код?   -  person PriyankaJ    schedule 04.04.2012
comment
Вы можете скопировать и вставить код в свой вопрос. Затем выделите свой код и нажмите кнопку { }. Он расположен непосредственно над текстовым полем, в которое вы вводите свой вопрос. Это приведет к отступу выделенной области и покажет код.   -  person Linger    schedule 04.04.2012


Ответы (1)


Один из способов - Зная год, вы можете получить начало года 2006-01-01 и конец года 2006-12-31. А затем отфильтруйте даты, которые находятся между ними.

Для создания предикатов — посмотрите Руководство по предикатам

У него есть несколько хороших примеров, в том числе некоторые, касающиеся предикатов NSDate.

person Community    schedule 04.04.2012