2016-09-20 2 views
0

Firebaseの新機能で、これでアプリを作成しようとしています。Firebase作成日時と日付が現在よりも大きいクエリをフィルタリングしました

マイアプリには特定の時間に作成された投稿があり、一定の時間が含まれています。

私は次のように私のデータを格納します。

"posts" : { 
    "postid1" : { 
     "author" : { 
     "full_name" : "author1", 
     "uid" : "idauthor1" 
     }, 
     "date" : 1474455840809, 
     "description" : "", 
     "title" : "Test 1" 
    }, 
    "postid2" : { 
     "author" : { 
     "full_name" : "author1", 
     "uid" : "idauthor1" 
     }, 
     "date" : 1480424400622, 
     "description" : "", 
     "title" : "Test 2" 
    } 
} 

postIDは、それが作成時刻で注文してするのに十分でなければならないので、自動的に生成されたが、私はまた、日付が今日過去であるものを除外するれます(now)。

どのようにすればいいのでしょうか?

答えて

6

"ServerValue.Timestamp"で日付を保存しているとします。

達成したいことは、引数として日付(今日)を渡す必要があり、ServerValue.Timestampを置くことができないため、直接実行できないと思います。 ref.orderByChild("date")

そして、クライアント側でのフィルタリング:私はどうなるのか

は、すべての記事をこのように照会することです。

編集 これは動作するはずです。 (

+0

日はパイですポストを作成するときにユーザーによってckedされます。 私がしようとしているのは、リストのキー(作成日)を注文し、日付が現地時間を過ぎている投稿を除外することです。 – Archipel

+0

編集済み@Archipel – Borja

+0

それ以上のものは削除しますが、 (orderByKey()) – Archipel

1

は、そのためのクエリは問題がある

// server_timestamp is a long type variable 
ref.child("posts").orderByChild("date").startAt(server_timestamp); 

でなければなりません

query.orderByChild("date").startAt(new DateTime().getMillis()) 

が次にあなたは、クライアント側でのキーで注文する必要があります(それは今日の後、日付、現地時間でポストを返します) @Bonjaのように)Firebaseの定数ServerValue.TIMESTAMPをそのメソッドに渡すことはできません。

だから、あなたは特別にServerValue.TIMESTAMPを保存する(時間は、ユーザーのデバイスのタイムゾーンに基づいており、それが正しく同期されない場合がありますので、を推奨しません)

Long server_timestamp = new Date().getTime(); 

または自分のハック方法(これを行うことができますいずれかノードとその値を取得します。はい、それはやるべき仕事がたくさんあります)

ref.child("current_timestamp").setValue(ServerValue.TIMESTAMP, new DatabaseReference.CompletionListener() { 
    @Override 
    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) { 
     databaseReference.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       Long server_timestamp = dataSnapshot.getValue(Long.class); 
       ref.child("posts").orderByChild("date").startAt(server_timestamp).addValueEventListener(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         Post post = dataSnapshot.getValue(Post.class); 
        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) {} 
       }); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) {} 
     }); 
    } 
}); 

・ホープ、このことができます:)

関連する問題