NSPredicate Core Data to many

时间:2013-10-22 07:34:44

标签: ios core-data nspredicate

这是核心数据模型。 Image

DiaCD< --->> HoraCD<< ---> ActividadCD

在实体中,“活动”是一个名为属性的类别,用于过滤活动。我的问题是:如何才能通过查询向我回复类别为“X”的活动?

尝试一下:

    NSEntityDescription *entityDescriptionDia = [NSEntityDescription entityForName:@"DiaCD" inManagedObjectContext:managedObjectContext];
    NSFetchRequest *requestDia = [[NSFetchRequest alloc] init];
    NSPredicate *predicateDia = [NSPredicate predicateWithFormat:@"ANY relDiaHora.relHoraActividad.categoria == %@", categoria];
    [requestDia setEntity:entityDescriptionDia];
    [requestDia setPredicate:predicateDia];

    NSError *errorDia;
    NSArray *arrayDia = [managedObjectContext executeFetchRequest:requestDia error:&errorDia];
    if ([arrayDia count] > 0) {
        for (DiaCD *dia in arrayDia) {
            NSSet *setHora = dia.relDiaHora;
            HoraCD *horaQuery = [setHora anyObject];
            ActividadCD *actividadQuery = horaQuery.relHoraActividad;
            NSLog(@"Act --> %@ y la categoria --> %@ y la categoria --> %@", actividadQuery.titulo, actividadQuery.categoria, categoria);
        }
    }

如果我这样做,查询不会返回不尊重该类别的好数据,我猜,不知道为什么:S。

尝试2:

NSPredicate *predicateDia = [NSPredicate predicateWithFormat:@"relDiaHora.relHoraActividad.categoria == %@", categoria];

如果我执行相同的查询但只删除“ANY”失败。错误:“原因:'这里不允许使用多个密钥'”

3 个答案:

答案 0 :(得分:0)

好的,第一位错了。但是,仍然请遵循关于命名的说明。

快速注释

您不应该调用属性“relItem1Item2”。这是来自关系数据库的东西。 CoreData不是关系数据库。

您应该将它们描述为他们所指向的名称。

relHoraActividad应该被称为actividad。因为它指向了激活实体,它是一种“一对一”的关系。

也...

relActividadHora应该被称为horaCDs。它指向horaCD实体,它是一种“多对多”的关系。

答案 1 :(得分:0)

你的谓词

[NSPredicate predicateWithFormat:@"ANY relDiaHora.relHoraActividad.categoria == %@", categoria];

返回具有给定活动类别的任何小时的所有日期。你的问题好像 是那个

NSSet *setHora = dia.relDiaHora;

返回所提取日期的所有小时数,而不仅仅是具有给定活动类别的小时数。

因此

HoraCD *horaQuery = [setHora anyObject];

所取得的任何小时,并且不需要具有给定的活动。

如果您需要天数和匹配小时数,则应在小时内执行获取请求 代替:

NSEntityDescription *entityDescriptionHour = [NSEntityDescription entityForName:@"HourCD" inManagedObjectContext:managedObjectContext];
NSFetchRequest *requestHour = [[NSFetchRequest alloc] init];
NSPredicate *predicateHour = [NSPredicate predicateWithFormat:@"relHoraActividad.categoria == %@", categoria];
[requestHour setEntity:entityDescriptionHour];
[requestHour setPredicate:predicateHour];

NSError *errorHour;
NSArray *arrayHours = [managedObjectContext executeFetchRequest:requestHour error:&errorHour];
if ([arrayHours count] > 0) {
    for (HourCD *hour in arrayHours) {
        DiaCD *dia = hour.relHoraDia;
        ActividadCD *actividad = hour.relHoraActividad;
        // ...
    }
}

答案 2 :(得分:0)

我认为你的设置很荒谬。当您只使用NSDate属性时,为什么复杂的关系可以显示日期和时间?

从您的图片中我看到您将其他内容存储在这些实体中,这些实体似乎与小时或天没有任何关系。

要按天或时间过滤,您通常会使用这样的模式

[NSPredicate predicateWithFormat:@"time > %@ && time < %@", min, max];