簡體   English   中英

NSPredicate核心數據對多

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM