代码之家  ›  专栏  ›  技术社区  ›  joselufo

NSP将核心数据重新分配给多个

  •  0
  • joselufo  · 技术社区  · 12 年前

    这是核心数据模型。 Image

    DiaCD<--->>HoraCD<<--->活动CD

    在实体中,“活动”是一个称为属性的类别,用于过滤活动。我的问题是: 我如何查询以返回类别为“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 回复  |  直到 12 年前
        1
  •  0
  •   Martin R    12 年前

    你的谓词

    [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
  •   Fogmeister    12 年前

    好吧,第一点错了。不过,请注意以下关于命名的说明。

    简短的笔记

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

    你应该用描述性的方式命名它们指向的是什么。

    relHoraActivitidad应该被称为actividad。因为它指向的是actividad实体,这是一种“对一”的关系。

    而且

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

        3
  •  0
  •   Mundi    12 年前

    我认为你的设置很荒谬。当你可以简单地使用 NSDate 属性?

    从你的图像中,我看到你在这些实体中存储了其他似乎与时间或天数无关的东西。

    要按天或时间进行筛选,通常使用以下模式

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