0

私は Core Data プロジェクトに取り組んでおり、modification_date フィールドを持つテーブルを持っています。また、(たとえば) 1PM と 9PM の間に Modification_date がある最後のn日間のすべてのエントリを抽出する必要があります。

で提案されているように、過去n日間のエントリだけを抽出するソリューションの一部を既に整理しました:コア データ - 日付を含む述語

NSDate *today = [NSDate date];
NSDate *end_day = [today addTimeInterval: (days*86400.0f)];
day_st = [NSString stringWithFormat: @"(timestamp >= %@) AND (timestamp <= %@) AND ", today, end_day];

私の唯一の問題は、期間ごとにフィルターを追加することです。しかし、結果のすべての要素の時間をチェックするために foreach を作成することを除いて、私は賢いものを思いつくことができません。

4

2 に答える 2

1

データ モデルに日付型フィールドを格納する場合、それを行う良い方法はありません。NSDateこれらは、参照日からの秒数として保存されます。同じことなので、フィルター処理が機能します。ただし、データストアはそれらについて何も知らないため、日付コンポーネント (1 日の時間など) に基づいて述語を作成することはできません。ほとんどの場合、データ ストアから結果を取得した後に結果をフィルター処理することは合理的な方法です。

これを頻繁に行う場合は、1 つまたは複数の新しい属性を追加することを検討してください。たとえば、1 日の時間を格納する整数フィールドです。次に、それらのフィールドを に含めることができますNSPredicate。日付フィールドが変更されるたびに、これらのフィールドの値を設定します。そして、それらのフィールドがどのタイムゾーンにあるかを知っていることを確認してください. UTC が望ましいです。現地時間はトラブルを求めています。UTC では、フィールドの値を設定してフェッチする前に、「1PM」、「9PM」などを UTC の同等の値に変換します。

最後に(これに気付いたかもしれませんが、質問からは明らかではありません)、リンク先の他の質問NSPredicateは、そこにいる間に構築していることに注意してくださいNSString

于 2012-12-18T01:20:16.997 に答える
1

次のような述語で終わることを目指していると思います。

((timestamp >= <startTimeOnDayOne>) AND (timestamp <= <endTimeOnDayOne>)) OR
((timestamp >= <startTimeOnDayTwo>) AND (timestamp <= <endTimeOnDayTwo>)) OR
[...]

適切な Cocoa 日付オブジェクトをどのように作成するかという点ではNSDateComponents、開始時刻用と終了時刻用の 2 つと、単純に「1 日」を表す 3 つ目の 2 つをシードする必要があるでしょう。次に、NSCalendar(あいまいな場合は現在のカレンダーのみ)とそのdateFromComponents:anddateByAddingComponents:toDate:options:メソッドを使用します。前者は最初の日の日付を取得し、後者はそれぞれ 1 日ずつ進めます。

各節点で 24 時間を追加しようとすると、夏時間のある地域で年に 2 回間違った結果が得られます。

NSPredicate関連する各日の s を配列に構築し、最後に を使用してそれらをすべてまとめて単一の述語にすることができます。これにより、実行時にnNSCompoundPredicate +orPredicateWithSubpredicates:日が何日であるかを心配することができます。

于 2012-12-18T01:58:02.937 に答える