1

NSPredicate に問題があります。私は Entry と呼ばれるコア データ オブジェクトを持っています。これには、creationDate と呼ばれる NSDate が含まれています。これを、日付と呼ばれる変数と比較したいと思います。

NSDate カテゴリを使用して両方のオブジェクトの個々の年を引き出し、コア データ カテゴリを使用してコア データ ストア内のすべての Entry オブジェクトに対して述語を実行しています。

[Entry allForPredicate:[NSPredicate predicateWithFormat:@"creationDate.year == %i",  date.year]];

期待した結果が得られず、代わりに空白になっているため、これは間違っていると思います。

これのどこが間違っているのですか?

4

2 に答える 2

4

Core Dataは、生のデータベース呼び出しを作成するときにカテゴリを組み込むことができるとは思えません。

あなたの場合、2つの日付を作成します。1つは今年の1月1日0:00で、1年後です。

 NSString *basePredicateString = @"creationDate >= %@ AND creationDate < %@";
 NSPredicate *predicate = [NSPredicate predicateWithFormat:basePredicateString, startDate, endDate];

完全を期すために—実際の年の開始日と終了日を生成する方法:

NSDate *startDate = [NSDate date];
[[NSCalendar currentCalendar] rangeOfUnit:NSYearCalendarUnit startDate:&startDate interval:NULL forDate:startDate];

NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease];
comps.year = 1;
NSDate *endDate = [[NSCalendar currentCalendar] dateByAddingComponents:comps toDate:startDate options:0];

この回答の下のコメントで、jbrennanは、実際にカテゴリを述語に組み込むことができると提案しました。彼はNSArraysとしてのコレクションに適していますが(彼はテストプロジェクトへのリンクを追加しました)、Core Dataフェッチ要求に関しては機能しません—少なくとも私はそれを機能させることができません。私は試した。これが私のテストです:https ://github.com/vikingosegundo/CoreDataCategoryTest

于 2012-06-08T18:52:30.987 に答える
1

@vikingosegundo には正しい答えがあります。述語でカテゴリを使用することはできません。

SQL を理解している場合は、次の「起動時に渡される引数」を設定してみてください。

-com.apple.CoreData.SQLDebug 1

これにより、リクエストによって生成された SQL を確認できます。これは、記述した述語がどのように SQL に変換されるかを理解するのに役立ちます。


@vikingosegundo ごとに再度編集 - OP の質問に従って CoreData を使用する場合、上記が適用されます

于 2012-06-08T18:58:48.327 に答える