首页 > 解决方案 > 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"];

知道我在这里做错了什么。

**

标签: iosobjective-ccore-datarelationship

解决方案


假设你有两个变量,selectedBrand分别selectedColor是你想要匹配的品牌和颜色细节。那么您的谓词将如下所示:

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

这假设您想要返回品牌和颜色都匹配的结果 - 如果您想要任何匹配的结果,请更改ANDOR.


推荐阅读