CoreData множественный запрос на выборку - PullRequest
0 голосов
/ 07 мая 2018

У меня есть основные модели данных и хранилища данных для устройств. Каждое устройство содержит цвета, хранилище и цену. Есть ли в любом случае я могу отфильтровать уже запрос выборки (массив всех устройств из БД). Мне нужно реализовать функциональность фильтра для устройств, содержащих цвет, хранение и цену. Фильтр может применяться несколько раз. Это означает, что после применения фильтра к цвету будут отображаться только те устройства, которые содержат этот цвет + соответствующие хранилища и наоборот. Я могу отфильтровать его один раз, используя предикаты, но для применения другого фильтра мне нужно снова вызвать запрос для получения всех устройств и применения уважаемого фильтра. Есть ли какой-то другой способ, поэтому, когда я получаю отфильтрованные данные из запроса на выборку, я могу применить другой фильтр к тем же отфильтрованным данным. или как я делаю это единственный способ работать с основными данными.

Вот как я фильтрую свои данные на основе выбранного фильтра:

-(void)getAllDevicesDetailBasedOnFilter{
    NSMutableArray *predicateArray = [NSMutableArray array];
    //DevicesCatalogueSkuDetails
    isColorSelected = YES;
    isBrandSelected = YES;
    isStorageSelected = YES;
    isPriceSelected = YES;
    if (isPriceSelected) {
        NSPredicate * pricePredicate =  [NSPredicate predicateWithFormat:@"ANY skuDetails.priceWithVat >= %.f AND ANY skuDetails.priceWithVat <= %.f",minimumPriceValue,maximumPriceValue];
        [predicateArray addObject:pricePredicate];
    }
    if (isBrandSelected) {
        NSPredicate * brandPredicate =  [NSPredicate predicateWithFormat:@"brand = %@", @"Samsung"];
        [predicateArray addObject:brandPredicate];
    }

    if (isColorSelected) {
        NSPredicate * colorPredicate = [NSPredicate predicateWithFormat:@"ANY skuDetails.color CONTAINS[cd] %@",@"Green"];
        [predicateArray addObject:colorPredicate];
    }

    if (isStorageSelected) {
        NSPredicate * colorPredicate = [NSPredicate predicateWithFormat:@"ANY skuDetails.storage CONTAINS[cd] %@",@"256"];
        [predicateArray addObject:colorPredicate];
    }

    NSPredicate *compoundPredicate =  [NSCompoundPredicate andPredicateWithSubpredicates:predicateArray];
    [[CoreDataManager sharedInstance] fetchWithEntity:@"DevicesCatalogue" Predicate:compoundPredicate success:^(NSArray *fetchLists) {
        if(fetchLists) {

        }

    }failed:^(NSError *error) {

    }];

}

1 Ответ

0 голосов
/ 08 мая 2018

Вы можете попробовать что-то подобное, используя локальное свойство для fetchLists

@property NSMutableArray fetchLists;

- (NSPredicate *) getFirstPredicate {
    // create your initial predicate here
}

- (NSPredicate *) getSecondPredicate {
    // create your second predicate here
}

- (void) fetchEntities {
    [[CoreDataManager sharedInstance] fetchWithEntity: @"DevicesCatalogue" predicate: nil 
        success: ^(NSArray *result) {
            if(result) {
                self.fetchLists = result;
            }
        } 
        failed: ^(NSError *error) {
            // handle error
    }];
}

И затем, откуда бы вы ни захотели получить и отфильтровать ваши данные, сделайте что-то вроде:

[self fetchEntities];
NSArray *firstFilteredArray = [self.fetchLists filteredArrayUsingPredicate: getFirstPredicate];
NSArray *secondFilteredArray = [firstFilteredArray filteredArrayUsingPredicate: getSecondPredicate];

и т.д.

Или используйте соединение для вашего первого и второго предиката, чтобы отфильтровать оригинал fetchLists.

...