[英]NSPredicate Core Data to-many
這是核心數據模型。 圖片
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”失敗。 錯誤:“原因:“此處不允許使用多對多鍵”
好的,第一句話是錯誤的。 但是,仍然要遵循有關命名的注意事項。
快速筆記
您不應將屬性稱為“ relItem1Item2”。 這是來自關系數據庫的東西。 CoreData不是關系數據庫。
您應該用描述性的方式對它們進行命名。
即
relHoraActividad應該稱為actividad。 指向活動實體,它是“一對一”的關系。
也...
relActividadHora應該稱為horaCD。 它指向horaCD實體,並且是“多對多”關系。
您的謂詞
[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;
// ...
}
}
我認為您的設置很荒謬。 當您僅可以使用NSDate
屬性時,為什么與幾天和幾小時的關系復雜?
從您的圖像中,我看到您在這些實體中存儲了其他與小時或天無關的東西。
要按日期或時間進行過濾,通常使用如下模式
[NSPredicate predicateWithFormat:@"time > %@ && time < %@", min, max];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.