これは、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'
私のコードの何が問題なのか誰にもわかりませんか? 提案やコメントは大歓迎です。
ありがとう、ジョー