【发布时间】:2018-04-28 10:08:13
【问题描述】:
我有一个关于核心数据关系的问题。我必须为设备目录的以下功能创建核心数据:
其中设备包含设备名称、设备 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);
}
}
但是现在我想根据我上面描述的条件添加一个过滤器,我该如何根据这个编写谓词。任何帮助或指导将不胜感激。
**
- 更新:
如果我使用这样的谓词,如 cmets 中所述:
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"];
知道我在这里做错了什么。
**
【问题讨论】:
标签: ios objective-c core-data relationship