ios - ios Coredata关系查询
问题描述
我有一个关于核心数据关系的问题。我必须为设备目录的以下功能创建核心数据:
其中 device 包含设备名称、设备 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"];
知道我在这里做错了什么。
**
解决方案
假设你有两个变量,selectedBrand
分别selectedColor
是你想要匹配的品牌和颜色细节。那么您的谓词将如下所示:
fetchRequest.predicate = [NSPredicate predicateWithFormat:@“deviceBrand.brandName == %@ AND ANY deviceColor.colorName == %@“, selectedBrand, selectedColor];
这假设您想要返回品牌和颜色都匹配的结果 - 如果您想要任何匹配的结果,请更改AND
为OR
.
推荐阅读
- java - 在三个片段之间共享 ViewModel
- python - 没有使用 groupby() 和 mean() 聚合的数字类型
- r - 在R中绘制雷达图线
- python - Python - 在列表列表中搜索字符串
- mysql - MySQL 查询 VALUES($1, $2)[ req.body.number1, req.body.number2] 不起作用?
- mysql - Node js表达了如何在另一个数据表已满时创建新的数据表
- arrays - 为什么在某些语言中 findIndex 返回 -1?
- javascript - React Hook 未使用 useEffect 设置
- r - 转换源数据的最佳方法?
- php - 带有 Clover 代码覆盖率报告的 PHPUnit:测试未执行且命令退出