これは、実際にはクラウド機能の使用例です。
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
値がデータベースに格納されます。
データベースからメッセージを読み取るときに終了時刻を処理するにはどうすればよいですか?まだ終了していないメッセージのみを表示している場合。 – iqpolar
私もこの例を追加しました。 – Grimthorr