2013-11-27 2 views
0

Моя модель данных выглядит следующим образом ...Соединение предиката не работает с MagicalRecord Fetch

< MNMerchant - (отношения категории) - >> MNCategory (CategoryId)

MNCategory имеет обратную связь с MNMerchant называемых «торговцами».

Контроллер my view отображает торговцев на карте. Первая выборка, которая ограничивает результаты по географическим границам карты работает отлично ...

NSMutableArray *filters = [NSMutableArray array]; 

NSMutableString *rectPred = [NSMutableString stringWithFormat:@"lng > %lf AND lng < %lf AND lat < %lf AND lat > %lf", northWestCorner.longitude, southEastCorner.longitude, northWestCorner.latitude, southEastCorner.latitude]; 

[filters addObject:[NSPredicate predicateWithFormat:rectPred]]; 

NSArray *merchantsInRect = [[MNMerchant MR_findAll] filteredArrayUsingPredicate:[NSCompoundPredicate orPredicateWithSubpredicates:filters]]; 

Моим данные выборки/тест правильно возвращает 3 продавцов. Вот выход журнала ...

FILTERS = (
    "lng > -105.961313 AND lng < -104.2035 AND lat < 41.048607 AND lat > 38.927436" 
) 
RESULTS = 3 MERCHANTS IN RECT 

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

NSMutableArray *categories = [NSMutableArray arrayWithObjects:nil]; 
for(MNMerchant *merchant in merchantsInRect){ 
    for(MNCategory *category in merchant.categories){ 
     if([categories indexOfObject:category] == NSNotFound){ 
      [categories addObject:category]; 
     } 
    } 
} 

[_tray setCategories:categories]; 

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

NSArray *merchantsForDisplay; 

if(useFilters){ 
    //FILTER MERCHANTS 
    if(_tray.selectedCategories.count == 0){ 
     [filters addObject:[NSPredicate predicateWithFormat:@"merchantId = 0"]]; 
    }else{ 
     [filters addObject:[NSPredicate predicateWithFormat:@"ANY categories.categoryId IN %@", [_tray.selectedCategories valueForKey:@"categoryId"]]]; 
    } 

    merchantsForDisplay = [MNMerchant MR_findAllSortedBy:@"sortName" ascending:YES withPredicate:[NSCompoundPredicate orPredicateWithSubpredicates:filters]]; 

}else{ 

    merchantsForDisplay = merchantsInRect; 

} 

Записан выход при включении и отключении категории ...

FILTERS = (
    "lng > -105.980539 AND lng < -104.222726 AND lat < 40.959464 AND lat > 38.835483", 
    "ANY categories.categoryId IN {2}" 
) 
RESULTS = 3 MERCHANTS IN RECT 

Однако эта выборка не фильтрует до выбранных категорий. Он все еще возвращает 3 торговца. Вот что merchantsForDisplay выглядит, когда накинут и вошли ...

MERCHANT 16695 
...HAS CATEGORY 1 
MERCHANT 16719 
...HAS CATEGORY 1 
...HAS CATEGORY 2 
MERCHANT 16712 
...HAS CATEGORY 1 

Я в полной растерянности понимая, почему мой «ANY categories.categoryId В% @» не работает. Помогите!

ответ

1

Чтобы ограничить результат к объектам с данной категории, вы должны использования andPredicateWithSubpredicates, не orPredicateWithSubpredicates, в

merchantsForDisplay = [MNMerchant MR_findAllSortedBy:@"sortName" ascending:YES withPredicate:[NSCompoundPredicate orPredicateWithSubpredicates:filters]]; 

Примечание: я бы рекомендовал не использовать stringWithFormat вообще когда здание предикатов, поскольку оно обрабатывает котировки, экранирование и спецификаторы формата по-разному от predicateWithFormat.

+0

OMG. Это неловко. Спасибо. –