【问题标题】:ios Coredata relationship queryios Coredata关系查询
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果我使用这样的谓词:NSPredicate *predicate = [NSPredicate predicateWithFormat:@"deviceBrand.brandName CONTAINS[cd] %@", @"Apple"]; [fetchRequest setPredicate:predicate];和 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"deviceColor.colorName CONTAINS[cd] %@", @"Blue"]; [fetchRequest setPredicate:predicate];分别它给了我正确的结果。
    • 但是如果我按照你的建议去做,它不会给我任何结果。我试试这个谓词: NSPredicate *predicate = [NSPredicate predicateWithFormat:@"deviceBrand.brandName == %@ AND ANY deviceColor.colorName == %@", @"Apple", @"Blue"];
    • 尝试在谓词的第二个子句中用“==[cd]”代替“==”。
    【解决方案2】:

    如果您的颜色和品牌模型的唯一属性是它们的名称,并且这些数据的唯一用途是用于过滤和搜索,那么在这种情况下对您的数据建模的性能较低。因此,最好只添加品牌名称而不是品牌模型和颜色名称而不是颜色模型,并根据它们过滤您的设备。

    即使你想在品牌和颜色中获得比名称更多的信息,最好将品牌名称和颜色名称分别保存在设备模型中,以便有一个有效的过滤和搜索结果,然后只有在你想显示更多时才使用品牌模型向用户提供有关特定品牌的信息。

    【讨论】:

    • 所以你的意思是说我应该删除这两个颜色和品牌表,并将它们放在设备表中,并与设备的关系目标?但是如何为单个设备保存多种颜色?
    • 您节省了,每个设备不止一种颜色?我没有注意到!所以不要删除颜色模型,如果用户想要查看具有特定颜色的设备。从您的数据库中获取该颜色并从中获取设备并将它们显示给用户
    • 但问题仍然存在,如何设置复合谓词以获取包含设备品牌和颜色的设备?
    • 因此,当您按照我在上面评论中解释的方式获得设备时,只需根据它们的品牌名称过滤它们。 (我们讨论过删除品牌模型,只添加品牌名称)
    • 这是获取带有品牌的设备的正确方法: NSPredicate *predicate = [NSPredicate predicateWithFormat:@"deviceBrand.brandName CONTAINS[cd] %@ AND devicePrice > 245.0", @"Apple"]; [fetchRequest setPredicate:predicate];
    猜你喜欢
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多