Несколько запросов на выборку со сложными предикатами - PullRequest
0 голосов
/ 19 марта 2012

У меня есть пара представлений, которые представляют данные из сущности CoreData в моем приложении.Чтобы получить данные, необходимые для представлений, мне часто приходится реализовывать несколько запросов fetchRequest, которые кажутся неправильными - возможно, я все еще допускаю базовые ошибки, такие как представление о CoreData в слишком большом смысле базы данных SQL.

На самом деле для одного из моих взглядов у меня есть 22 запроса на выборку, которые вполне могут быть правильным способом достижения того, что мне нужно, но как новичок в iPhone / Objective-C я не могу не подвергать сомнению свой подход.Вот фрагмент моего кода, показывающий 2 из множества fetchRequest. Не могли бы вы подтолкнуть меня в правильном направлении, если я делаю это неправильно?

      SGK_T4T_01AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = [appDelegate managedObjectContext];
    NSEntityDescription *entityDiscription = [NSEntityDescription entityForName:@"Sessions" inManagedObjectContext:context];

//Swim 3 Count
        NSFetchRequest *request2 = [[NSFetchRequest alloc] init];
        [request2 setEntity:entityDiscription];
        [request2 setResultType:NSDictionaryResultType];
        NSExpression *keyPathExpression2 = [NSExpression expressionForKeyPath:@"sport"];
        NSExpression *swimCountExpression = [NSExpression expressionForFunction:@"count:" arguments:[NSArray arrayWithObject:keyPathExpression2]];
        NSExpressionDescription *expressionDescription2 = [[NSExpressionDescription alloc] init];
        [expressionDescription2 setName:@"swimCount"];
        [expressionDescription2 setExpression:swimCountExpression];
        [expressionDescription2 setExpressionResultType:NSInteger16AttributeType];
        [request2 setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription2]];
        NSPredicate *pred2 = [NSPredicate predicateWithFormat:@"(date >= %@ AND sport like %@)", swimSinceDateAsDate, sportTypeSwim];
        [request2 setPredicate:pred2];

        NSError *error2;
        NSArray *objects2 = [context executeFetchRequest:request2 error:&error2];
        if (objects2 == nil) {
            NSLog(@"The fetch request returned an array == nil");
        } else {
            _swimTotalSwimCountLabel.text = [[NSString alloc] initWithFormat:@"%@", [[objects2 objectAtIndex:0] valueForKey:@"swimCount"]];
        }

        //Swim 4 Fastest 1500m Time Trial
        NSFetchRequest *request3 = [[NSFetchRequest alloc] init];
        [request3 setEntity:entityDiscription];
        [request3 setResultType:NSDictionaryResultType];
        NSExpression *keyPathExpression3 = [NSExpression expressionForKeyPath:@"time1"];
        NSExpression *swimfastest1500Expression = [NSExpression expressionForFunction:@"min:" arguments:[NSArray arrayWithObject:keyPathExpression3]];
        NSExpressionDescription *expressionDescription3 = [[NSExpressionDescription alloc] init];
        [expressionDescription3 setName:@"swimFastest1500"];
        [expressionDescription3 setExpression:swimfastest1500Expression];
        [expressionDescription3 setExpressionResultType:NSInteger16AttributeType];
        [request3 setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription3]];
        NSString *sessType3 = @"Time Trial - 1500m";
        NSPredicate *pred3 = [NSPredicate predicateWithFormat:@"(date >= %@ AND sport like %@ AND sessiontype like %@)", swimSinceDateAsDate, sportTypeSwim, sessType3];
        [request3 setPredicate:pred3];

        NSError *error3;
        NSArray *objects3 = [context executeFetchRequest:request3 error:&error3];
        if (objects3 == nil) {
            NSLog(@"The fetch request returned an array == nil");
        } else {
            NSUInteger durationInSeconds = [[[objects3 objectAtIndex:0] valueForKey:@"swimFastest1500"] integerValue];
            NSUInteger durationInMinutes = durationInSeconds / 60;
            NSUInteger durationRemainder = durationInSeconds % 60;
            _swimTt1500PaceLabel.text = [[NSString alloc] initWithFormat:@"%02i:%02i", durationInMinutes, durationRemainder];
        }

Заранее спасибо за любую помощь, ссылки или направлениеможет быть в состоянии обеспечить ...

1 Ответ

0 голосов
/ 19 марта 2012

Материал предикатов не выглядит слишком плохо - но могу ли я спросить, почему вы ограничиваете все эти описания NSExpressionDescription? Анализировали ли вы и обнаружили ли вы, что, ограничившись только этими свойствами, вы обнаружили конкретное улучшение производительности? Базовые данные, как правило, довольно хороши в сбое / оптимизации вашей памяти, и это может немного очистить операторы.

...