실제로 클라우드 기능에 대한 유용한 사용 예입니다.
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
위치로 클라우드 기능을 첨부 할 수 있습니다 : 데이터베이스에 메시지를 저장할 때 당신이 뭔가를 할 수 있도록
, 당신은 자동으로 중포 기지 서버의 타임 스탬프를 삽입 할 ServerValue.TIMESTAMP
을 사용할 수 있습니다 새로운 데이터를 청취하십시오. 이 기능은 startTime
값으로 10 시간 추가하고 다시 같은 아이에게 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
});
}
});
들만을 얻기 위해 메시지의 목록을 조회하는 곳 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) { }
});
}
이 예는 먼저 추정 된 현재 서버 시간을 계산하기 위해 clock skew value (from .info/serverTimeOffset
)을 잡고 다음은 현재 후 endTime
와 메시지를 반환에 startAt()
쿼리에서이를 사용하여 아직 통과하지, 당신은 뭔가를 할 수 시각. 서버의 타임 스탬프를 획득하고 메시지를 저장, 또는 단지 (startAt
시간 전 사용) startTime
에 쿼리하는 동안 위의 로직을 수행하는 것처럼, 너무이 접근하는 다른 몇 가지 가능성이있다
.
그러나 클라우드 기능 경로를 사용하면 endTime
이 서버 쪽에서 계산되도록하는 것이 좋으며 새 메시지 저장은 빠르게 수행되며 메시지에는 실제로 endTime
값이 포함되어 있습니다.
데이터베이스에서 메시지를 읽을 때 종료 시간을 처리하는 방법은 무엇입니까? 아직 끝나지 않은 메시지 만 표시하는 경우. – iqpolar
나는 이것에 대한 예제도 추가했다. – Grimthorr