запрос отношения ios Coredata - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть вопрос относительно отношения к основным данным. Я должен создать основные данные для следующих функций каталога устройств:

где устройство содержит имя устройства, номер SKU устройства, цену устройства, марку и цвет устройства. У меня есть фильтр в моем приложении, который запрашивает все данные на основе уважаемого фильтра. например, если пользователь нажимает на бренд, он отображает список брендов, а затем фильтр применяется к набору данных только для определенного бренда, то же самое относится и к цвету, если пользователь выбирает любой цвет, он будет отображать устройства определенного цвета. Кроме того, пользователь может выбрать несколько фильтров, например, бренд + цвет.

в этой ситуации я создал эту модель данных:

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

device data model забывая все устройства я пишу этот код:

-(void)loadAllDevices{
    // Fetching
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Device"];

    // Add Sort Descriptor
    NSSortDescriptor *sortDescriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"deviceName" ascending:YES];
    NSSortDescriptor *sortDescriptor2 = [NSSortDescriptor sortDescriptorWithKey:@"devicePrice" ascending:YES];
    [fetchRequest setSortDescriptors:@[sortDescriptor1, sortDescriptor2]];

    // Execute Fetch Request
    NSError *fetchError = nil;
    NSArray *result = [self.managedObjectContext executeFetchRequest:fetchRequest error:&fetchError];

    if (!fetchError) {
        for (NSManagedObject *managedObject in result) {
            NSLog(@"DeviceName = %@, DevicePrice = %@", [managedObject valueForKey:@"deviceName"], [managedObject valueForKey:@"devicePrice"]);
            Brand * deviceBrand = [managedObject valueForKey:@"deviceBrand"];
            NSLog(@"Device Brand = %@",deviceBrand.brandName);
                NSSet *deviceColorSet = [managedObject valueForKey:@"deviceColor"];
                for (Color *color in deviceColorSet) {
                    NSLog(@"Device Color = %@", color.colorName);
                }
        }

    } else {
        NSLog(@"Error fetching data.");
        NSLog(@"%@, %@", fetchError, fetchError.localizedDescription);
    }
}

но теперь я хочу добавить фильтр на основе условия, которое я описал выше, как я могу написать предикаты, основанные на этом. любая помощь или направление к этому будет оценено.

**

  • UPDATE

Как описано в комментариях, если я использую предикат, как это:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"deviceBrand.brandName CONTAINS[cd] %@", @"Apple"]; [fetchRequest setPredicate:predicate]; and NSPredicate *predicate = [NSPredicate predicateWithFormat:@"deviceColor.colorName CONTAINS[cd] %@", @"Blue"]; [fetchRequest setPredicate:predicate];

отдельно он дал мне правильный результат.

но если я попытаюсь объединить оба, это не даст мне никакого результата. я попробую этот предикат:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"deviceBrand.brandName == %@ AND ANY deviceColor.colorName == %@", @"Apple", @"Blue"];

любая идея, что я здесь делаю неправильно.

**

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Предположим, у вас есть две переменные, selectedBrand и selectedColor, которые обозначают марку и цвет, которые вы хотите сопоставить. Тогда ваш предикат будет выглядеть так:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@“deviceBrand.brandName == %@ AND ANY deviceColor.colorName == %@“, selectedBrand, selectedColor];

Предполагается, что вы хотите вернуть результаты, если совпадают как марка, так и цвет - если вы хотите, чтобы результаты совпадали, измените AND на OR.

0 голосов
/ 28 апреля 2018

Если единственное свойство вашего цвета и модели бренда - это их имя и эти данные используются только для фильтрации и поиска, моделирование ваших данных в такой ситуации имеет низкую производительность. Поэтому лучше добавить только brandName вместо фирменной модели и colorName вместо цветовой модели и отфильтровать устройства на их основе.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...