Предикат NSFetchedResultsController НЕ фильтрует его часть (используя ANY, IN и BETWEEN в том же предикате fechRequest) - PullRequest
0 голосов
/ 25 июля 2011

Я много искал здесь и не мог найти решение моей ситуации:

У меня есть TableViewController, который использует NSFetchedResultsController для отображения данных из CoreData.

Модель имеетСущность "Места", которая имеет отношение ко многим, называемое "Типы" (и обратное, также отношение ко многим).

В первом TableViewController я отображаю объекты из «типов» сущностей (каждое место может принадлежать более чем одному типу, а один тип может иметь более одного места).Когда пользователь нажимает на строку, он вызывает новый TableViewController, который будет отображать объекты из сущностей "Places", связанных с "Types", используя NSFetchedResultsController.

Я знаю, что мог бы просто использовать:

NSSet = [aType valueForKey:@"Places"];

Тем не менее, я действительно хочу использовать NSFetchedResultsController и все его преимущества.

Что ж, в методе доступа NSFetchedResultsController я смог воссоздать это отношение, используя:

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Places" 
                                          inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

NSDictionary *types = [NSDictionary dictionaryWithObjectsAndKeys:self.theTypes, @"TYPES", nil];
NSPredicate *predicateAny = [NSPredicate 
                             predicateWithFormat:@"ANY types IN $TYPES"];
NSPredicate *predicate = [predicateAny predicateWithSubstitutionVariables:types];

Этот кодработает нормально, так как возвращает «Места», связанные с «Типами», которые я хочу (они были сохранены внутри свойства theTypes).Я использую свойство (theTypes) в TableViewController для хранения всех объектов "Types", выбранных в исходном tableViewController.

Проблема заключается в том, что у сущности "Places" есть свойство с именем "distance", которое я такженеобходимо использовать в качестве фильтра внутри NSPredicate, например:

NSNumber *radious = [NSNumber numberWithDouble:10000.00];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"distance BETWEEN {0 , %@}", radious];
NSDictionary *types = [NSDictionary dictionaryWithObjectsAndKeys:self.theTypes, @"TYPES", nil];
NSPredicate *predicateAny = [NSPredicate 
                             predicateWithFormat:@"ANY types IN $TYPES"];
NSPredicate *predicate = [predicateAny predicateWithSubstitutionVariables:types];
NSPredicate *thePred = [NSCompoundPredicate andPredicateWithSubpredicates:
                        [NSArray arrayWithObjects:predicate, pred,  nil]];
[fetchRequest setPredicate:thePred];

Вот где возникает проблема: фильтр «расстояния», по-видимому, просто игнорируется предикатом в fetchRequest.В полученной выборке всегда есть места, которые не соответствуют @ "расстоянию между предложением {0,% @}.

Может кто-нибудь помочь мне выяснить, чего мне здесь не хватает?

Спасибомного! Даниэль

1 Ответ

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

Этот предикат:

NSPredicate *predicateAny = [NSPredicate 
                             predicateWithFormat:@"ANY types IN $TYPES", 
                             radious];

Не имеет смысла, потому что вы не используете переменную radious в этом предикате.Не уверен, что это является источником проблемы, но вы все равно должны его устранить.

Этот предикат:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"distance BETWEEN {0 , %@}", radious];

... может быть:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"distance <=%@", radious];

..., если у вас нет возможности отрицательного значения radious.Так будет намного быстрее.

...