0

这是核心数据模型。图片

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”会失败。错误:“原因:'此处不允许使用多对多键'”

4

3 回答 3

0

好的,第一点是错误的。但是,仍然遵循这个关于命名的说明。

速记

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

您应该描述性地命名它们,以了解它们所指向的内容。

IE

relHoraActividad 应该称为 actividad。因为它指向 actividad 实体,所以它是“一对一”的关系。

还...

relActividadHora 应该被称为 horaCD。它指向 horaCD 实体,并且是“对多”关系。

于 2013-10-22T07:43:09.847 回答
0

我认为你的设置很荒谬。NSDate当您可以简单地使用属性时,为什么要与日期和时间建立复杂的关系?

从您的图像中,我看到您在这些实体中存储了其他似乎与数小时或数天没有任何关系的东西。

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

[NSPredicate predicateWithFormat:@"time > %@ && time < %@", min, max];
于 2013-10-22T08:25:09.270 回答
0

你的谓词

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

返回具有给定活动类别的任何小时的所有天。你的问题似乎是

NSSet *setHora = dia.relDiaHora;

返回获取日期的所有时间,而不仅仅是给定活动类别的时间。

所以

HoraCD *horaQuery = [setHora anyObject];

是获取日期的任何时间,并且不需要具有给定的活动。

如果您需要日期和匹配时间,则应改为在时间上执行 fetch 请求:

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;
        // ...
    }
}
于 2013-10-22T08:17:53.673 回答