2016-09-24 9 views
1

私はレルムを使用してローカルにデータを格納しています。レルムを使用して特定の月のデータを照会

特定の月のデータを取得したい。つまり1月のデータのみを表示します。

フィールドタイプは日付です。

Sqlliteではを使用できます。strftime( '%m'、column_name)= '05';しかし、領域では解決策を見つけることができません。

ありがとうございました。

+0

1月を行うことができますか? – EpicPandaForce

+0

@EpicPandaForce私は月のデータを表示したいので、年と比較したくありません。 –

答えて

1

1月1日、00:00:00:000の日付と2月1日、00:00:00:000(Calendar APIなど)の日付を設定する必要があります。そして

RealmResults<Obj> results = realm.where(Obj.class) 
     .greaterThanOrEqualTo("date", januaryDate) 
     .lessThan("date", februaryDate) 
     .findAllSorted("date", Sort.ASCENDING); 

EDIT使用: "月に基づいた"さて、照会をすべてが簡単ではありません。デフォルトでは、時間間隔などの日付のみを照会できます。

あなたはしかし、複数のオプションがあります。

1.)あなたの最小値と最大の日付の間に特定の月のすべての可能な年のクエリを構築します。その後

public class Obj extends RealmObject { 
    @Index 
    private Date date; 

    //getters, setters 
} 

Date minimumDate = realm.where(Obj.class).minimumDate(); 
Date maximumDate = realm.where(Obj.class).maximumDate(); 
Calendar minCalendar = Calendar.getInstance(); 
Calendar maxCalendar = Calendar.getInstance(); 
if(minimumDate == null) { 
    minimumDate = new Date(); 
} 
if(maximumDate == null) { 
    maximumDate = new Date(); 
} 
minCalendar.setTime(minimumDate); 
maxCalendar.setTime(maximumDate); 
int minimumYear = minCalendar.get(Calendar.YEAR); 
int maximumYear = maxCalendar.get(Calendar.YEAR); 
Calendar transientCalendar = Calendar.getInstance(); 
transientCalendar.set(Calendar.DAY_OF_MONTH, 1); 
transientCalendar.set(Calendar.HOUR_OF_DAY, 0); 
transientCalendar.set(Calendar.MINUTE, 0); 
transientCalendar.set(Calendar.SECOND, 0); 
transientCalendar.set(Calendar.MILLISECOND, 0); 

RealmQuery<Obj> query = realm.where(Obj.class); 
boolean isFirst = true; 
for(int i = minimumYear; i <= maximumYear; i++) { 
    if(isFirst) { 
     isFirst = false; 
    } else { 
     query.or(); 
    } 
    query.beginGroup(); 
    transientCalendar.set(Calendar.YEAR, i); 
    transientCalendar.set(Calendar.MONTH, Calendar.JANUARY); 
    query.greaterThanOrEqualTo("date", transientCalendar.getTime()); 
    transientCalendar.set(Calendar.MONTH, Calendar.FEBRUARY); 
    query.lessThan("date", transientCalendar.getTime()); 
    query.endGroup(); 
} 
// then you can do 
RealmResults<Obj> results = query.findAllSorted("date", Sort.ASCENDING); 

2)あなたが設定した日付に基づいて、月が含まれてモデル内で更新フィールドを保持します。

public class Obj extends RealmObject { 
    private Date date; 

    @Index 
    private String month; 

    public String getMonth() { 
     return month; 
    } 

    @Deprecated 
    public void setMonth(String month) { 
     this.month = month; 
    } 

    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
     if(date == null) { 
      this.month = null; 
     } else { 
      this.month = new SimpleDateFormat("MMMMM", Locale.US).format(date); 
     } 
    } 
} 

次に、あなたが与えられた年で

RealmResults<Obj> results = realm.where(Obj.class).equalTo("month", "January").findAll(); 
+0

月のデータを表示したいので、年と比較したくありません。 –

+0

ああ、そう簡単ではありません。しかし、私はそれの楽しみのために私の答えを編集 – EpicPandaForce

+0

ありがとう、@エピックパンダフォース。私はもっ​​と便利だと試してみましょう... –

関連する問題