这是核心数据模型。 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”失败。错误:“原因:'这里不允许使用多个密钥'”
答案 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];