2

私たちのアプリでは、新しいデータの終了日時も保存することが非常に重要です。Firebaseリアルタイムデータベースのend datetimeの使い方

たとえば、新しいメッセージを書き込む場合、ユーザーには10時間しか表示されません。残りのAPIで& sqlデータベースを使用すると、サーバー時間(+ 10時間)で終了日時を簡単に作成し、メッセージをデータベースに保存できます。ユーザーのためのメッセージを読み込む際に、終わりのdatetimeが今までのところにあるすべてのメッセージを選択できます。

Firebase Realtime Databaseでどうすればいいですか?ファイアベースのクラウド機能が付いているのでしょうか?私はクライアントの時間を使いたくありません。

答えて

3

これは、実際にはクラウド機能の使用例です。

public void saveMessage(String content) { 
    DatabaseReference messagesRef = FirebaseDatabase.getInstance().getReference("messages"); 

    HashMap<String, Object> message = new HashMap<>(); 
    message.put("content", content); 
    message.put("startTime", ServerValue.TIMESTAMP); 

    messagesRef.push().setValue(message); 
} 

次にあなたがmessages場所にクラウド機能を付けることができます。データベースへのメッセージを保存するとき、あなたのような何かができるよう

、あなたは、自動的にFirebaseサーバーのタイムスタンプを挿入するためにServerValue.TIMESTAMPを使用することができます新しいデータを聞きなさい。場合にのみendTimeそれらを得るために、メッセージのリストを照会するために、

最後
exports.calculateEndTime = functions.database 
    .ref('/messages/{messageId}').onCreate(event => { 
     const message = event.data.val(); 

     // Only calculate endTime if it doesn't already exist. 
     if (message && !message.endTime) { 
     // Add 10 hours (in milliseconds) to the startTime to obtain the endTime. 
     const endTime = message.startTime + (10 * 3600000); 

     // Update the Firebase Database with the new endTime value. 
     return event.data.adminRef.update({ 
      endTime: endTime 
     }); 
     } 
    }); 

:この関数は、のようなものをstartTime値に10時間を追加し、戻って同じ子にendTimeとして保存するロジックを実行することができ経過していない、あなたのような何かができる:

// Obtain the server time using the .info/serverTimeOffset value. 
DatabaseReference offsetRef = FirebaseDatabase.getInstance().getReference(".info/serverTimeOffset"); 
offsetRef.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
     // Calculate the estimated server time based on the offset. 
     double offset = snapshot.getValue(Double.class); 
     double estimatedServerTimeMs = System.currentTimeMillis() + offset; 

     // Use this server time to get the messages. 
     getMessages(estimatedServerTimeMs); 
    } 

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

public void getMessages(double endTime) { 
    DatabaseReference messagesRef = FirebaseDatabase.getInstance().getReference("messages"); 

    // Create a query to limit results where endTime is greater than the current time. 
    Query messagesQuery = messagesRef.orderByChild("endTime").startAt(endTime); 

    messagesRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot message : dataSnapshot.getChildren()) { 
       // ... 
      } 
     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { } 
    }); 
} 

この例では、第1の推定現在のサーバー時刻を計算するclock skew value (from .info/serverTimeOffset)をつかみ、その後、現在の後endTimeとメッセージを返すだけにstartAt()クエリでこれを使用しています時間。


サーバーのタイムスタンプを取得し、メッセージの保存、あるいは単に(10時間前startAtを使用して)startTimeに照会しながら、上記のロジックを実行するように、あまりにもこれにアプローチするには、いくつかの他の方法は、可能性があります。

ただし、endTimeがサーバー側で計算されるようにするには、Cloud Functionsルートを使用することをお勧めします。新しいメッセージの保存はすぐに実行され、メッセージには実際にはendTime値がデータベースに格納されます。

+0

データベースからメッセージを読み取るときに終了時刻を処理するにはどうすればよいですか?まだ終了していないメッセージのみを表示している場合。 – iqpolar

+1

私もこの例を追加しました。 – Grimthorr

関連する問題