0

これがコアデータモデルです。画像

DiaCD <--->> HoraCD <<---> ActividadCD

エンティティの「アクティビティ」は、アクティビティをフィルタリングするための属性と呼ばれるカテゴリです。私の質問は次のとおりです。カテゴリが「X」である活動の日々を返すには、どうすればクエリを作成できますか?

1つ試してください:

    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」のみを削除すると失敗します。エラー: 「理由: 'to-many キーはここでは許可されていません'」

4

3 に答える 3

0

あなたの設定はばかげていると思います。NSDate単純に属性を使用できるのに、なぜ曜日と時間の関係が複雑になるのでしょうか?

あなたの画像から、これらのエンティティに他のものを保存していることがわかりますが、これらは時間や日とは何の関係もないようです.

日または時間でフィルタリングするには、通常、次のようなパターンを使用します

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

OK、最初のビットが間違っていました。ただし、命名については、この注意事項に従ってください。

簡単なメモ

属性を「relItem1Item2」と呼ぶべきではありません。これは、リレーショナル データベースに由来するものです。CoreData はリレーショナル データベースではありません。

それらが何を指すかについて、わかりやすい名前を付ける必要があります。

すなわち

relHoraActividad は actividad と呼ぶ必要があります。Actividad エンティティを指しており、「対 1」の関係であるためです。

また...

relActividadHora は horaCD と呼ばれるべきです。これは horaCD エンティティを指しており、「対多」の関係です。

于 2013-10-22T07:43:09.847 に答える
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;
        // ...
    }
}
于 2013-10-22T08:17:53.673 に答える