0

という属性を持つ(SQL)コードデータエンティティがありますdate。次のように、述語とフェッチ リクエストを作成し、結果を保持する配列を宣言します。

NSDate *firstDate = <date1>;
NSDate *lastDate = <date2>;
NSArray *dates = [NSArray arrayWithObjects: firstDate, lastDate, nil];
NSPredicate *myPredicate = [NSPredicate predicateWithFormat: 
    @"date BETWEEN %@", dates];

NSFetchRequest * req = [NSFetchRequest fetchRequestWithEntityName:@"myEntity"];
NSArray * results;

以下の作品

results = [managedObjectContext executeFetchRequest:req error:nil];
// gets all records
results = [results filteredArrayUsingPredicate:myPredicate];
// results now has the records I wanted

しかし、以下はそうではありません

req.predicate = myPredicate;
NSArray * results = [managedObjectContext executeFetchRequest:req error:nil];

これはコンソールで

-[__NSTaggedDate constantValue]: 認識できないセレクターがインスタンスに送信されました...

すべてのレコードを取得してからフィルタリングする必要があるのは間違っているようです。フェッチ要求で述語が機能しないのはなぜですか? これは SQLite の制限ですか? 日付が s (つまり double) として格納されていることは知ってNSTimeIntervalおり、代わりに述語でこれらを試しましたが、同様の問題があります。

4

2 に答える 2

1

おそらくこれはあなたが探しているものです..

datePredicate = [NSPredicate predicateWithFormat:@"(%@ <= 日付 && 日付 <= %@)", endDate, startDate];

endDate と startDate は NSDate です

于 2012-09-19T13:18:03.613 に答える
-1

これがクラッシュする理由は、配列内のものがNSDateインスタンスであってはならないためです。は、であるNSExpressionオブジェクトである必要があります。集計式のドキュメントには、次のように書かれています。constantValueNSDate

集約式を使用すると、さらに式を含むコレクションに評価される式を含む述語を作成できます。

したがって、コレクションには日付ではなく式が含まれている必要があります。

于 2012-09-17T13:13:54.367 に答える