У меня есть вопрос относительно отношения к основным данным. Я должен создать основные данные для следующих функций каталога устройств:
где устройство содержит имя устройства, номер SKU устройства, цену устройства, марку и цвет устройства. У меня есть фильтр в моем приложении, который запрашивает все данные на основе уважаемого фильтра. например, если пользователь нажимает на бренд, он отображает список брендов, а затем фильтр применяется к набору данных только для определенного бренда, то же самое относится и к цвету, если пользователь выбирает любой цвет, он будет отображать устройства определенного цвета. Кроме того, пользователь может выбрать несколько фильтров, например, бренд + цвет.
в этой ситуации я создал эту модель данных:
здесь я создал 3 разные таблицы, в которых устройство имеет много-много взаимосвязей с цветом, поскольку устройство может иметь несколько цветов. и цвета могут иметь несколько устройств.
для бренда я использую отношения многие к одному. поскольку одно устройство может иметь только одну марку, но, с другой стороны, торговая марка может содержать несколько устройств.
забывая все устройства я пишу этот код:
-(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);
}
}
но теперь я хочу добавить фильтр на основе условия, которое я описал выше, как я могу написать предикаты, основанные на этом. любая помощь или направление к этому будет оценено.
**
Как описано в комментариях, если я использую предикат, как это:
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"];
любая идея, что я здесь делаю неправильно.
**