1

これは、stackoverflow での最初の質問です。このコミュニティは私にとって非常に役に立ちました。iPhone アプリの開発に多くのソリューションを提供してくれました。しかし、今週問題が発生し、2 日間かけても何の進展もありませんでした。ここに質問を投稿しています。皆さんの助けを借りて修正できることを願っています。

私はコアデータを使用しており、Prayers と Schedules の 2 つのテーブルが多対多の関係にあります。今日予定されている祈りのリストを取得したい。これが私のコードです:

    NSPredicate *predicate;
    unsigned units = NSDayCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;

    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    [gregorian setTimeZone:[NSTimeZone localTimeZone]]; 
    [gregorian setFirstWeekday:1];
    NSDateComponents* comps = [gregorian components:units fromDate:[NSDate date]]; // Get necessary date components
    [comps setHour:0];
    [comps setMinute:0];
    [comps setSecond:1];

    //get beginning of today
    NSDate *startOfToday = [gregorian dateFromComponents:comps];
    //get the beginning of tomorrow
    [comps setDay:[comps day] + 1];
    NSDate *endOfDay = [gregorian dateFromComponents:comps];

    NSLog(@"%@ %@", startOfToday,endOfDay);

    predicate = [NSPredicate predicateWithFormat:@"ANY (schedules.nextEventDateTime >= %@ AND schedules.nextEventDateTime < %@) AND prayerType == 0 AND finished == YES AND answered == NO", startOfToday, endOfDay];

    [request setPredicate:predicate];
        NSError *error = nil;
    NSArray *fetchResults = [context executeFetchRequest:request error:&error];

このコードは、xcode 4.5.2 と ARC にアップグレードする前は正常に機能していました。xcode 4.5.2でアプリをARCに変換した後。アプリを実行すると、次の行でエラー (クラッシュ) が発生しました (他のすべては問題ないようです)。

    predicate = [NSPredicate predicateWithFormat:@"ANY (schedules.nextEventDateTime >= %@ AND schedules.nextEventDateTime < %@) AND prayerType == 0 AND finished == YES AND answered == NO", startOfToday, endOfDay];

コンソール出力とエラーは次のとおりです。

     2013-03-15 23:41:36.763 WePrayers[12121:c07] 2013-03-15 04:00:01 +0000 2013-03-16 04:00:01 +0000

     2013-03-15 23:41:37.837 WePrayers[12121:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "ANY (schedules.nextEventDateTime >= %@ AND schedules.nextEventDateTime < %@) AND prayerType == 0 AND finished == YES AND answered == NO"'
     *** First throw call stack:
     (0x29f2012 0x20ebe7e 0x1abc25 0x1aba43 0x1ab9f7 0x19ce5 0x186fb 0x61e8d5 0x61eb3d 0x190e83 0x29b1376 0x29b0e06 0x2998a82 0x2997f44 0x2997e1b 0x2f207e3 0x2f20668 0x56f65c 0x2ecd 0x2e05)
     libc++abi.dylib: terminate called throwing an exception

行を次のように変更しようとしましたが、問題なく機能しました。

    predicate = [NSPredicate predicateWithFormat:@"ANY schedules.nextEventDateTime >= %@ AND prayerType == 0 AND finished == YES AND answered == NO", startOfToday];

ただし、今日のみにスケジュールされているスケジュールを取得するには、schedules.nextEventDateTime >= startOfToday と < endOfDay を比較する必要があります。

行を次のように変更すると(括弧を削除します)

    predicate = [NSPredicate predicateWithFormat:@"ANY schedules.nextEventDateTime >= %@ AND schedules.nextEventDateTime < %@ AND prayerType == 0 AND finished == YES AND answered == NO", startOfToday, endOfDay];

この行をパスすると実行されますが、次の行で失敗します: NSArray *fetchResults = [context executeFetchRequest:request error:&error];

エラー: *キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: 'to-many key not allowed here'

私のコードの何が問題なのか誰にもわかりませんか? 提案やコメントは大歓迎です。

ありがとう、ジョー

4

1 に答える 1

0

あなたの場合、あなたSUBQUERYを助けるかもしれないと思います。

predicate = [NSPredicate predicateWithFormat:@"prayerType == 0 AND finished == YES AND answered == NO AND SUBQUERY(schedules, $sub, $sub.nextEventDateTime >= %@ AND $sub.nextEventDateTime <  %@).@count > 0", startOfToday, endOfDay];

そして、表現の順番に注意してください。一般に、結合 (リレーションシップをクロスするクエリ) もコストのかかる操作であるため、可能であれば避ける必要があります。最初のテストが成功しない限り、結合を回避します。

于 2013-03-16T10:12:53.240 に答える