2

우리의 앱에서는 새로운 데이터의 끝 날짜를 저장하는 것이 매우 중요합니다.Firebase Realtime Database에서 end datetime을 사용하는 방법

예를 들어 새 메시지를 작성하는 경우 사용자에게 10 시간 만 표시되도록하고 싶습니다. 나머지 API는 & sql 데이터베이스를 사용하여 서버 시간 (+ 10 시간)으로 끝나는 datetime을 쉽게 만들 수 있으며 데이터베이스에 메시지를 저장할 수 있습니다. 사용자를위한 메시지를로드 할 때 datetime이 끝나는 모든 메시지를 선택할 수 있습니다.

어떻게하면 Firebase Realtime Database로이 작업을 수행 할 수 있습니까? 어쩌면 Firebase Cloud 기능이 있습니까? 나는 클라이언트 시간을 사용하고 싶지 않다.

답변

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 위치로 클라우드 기능을 첨부 할 수 있습니다 : 데이터베이스에 메시지를 저장할 때 당신이 뭔가를 할 수 있도록

, 당신은 자동으로 중포 기지 서버의 타임 스탬프를 삽입 할 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 값이 포함되어 있습니다.

+0

데이터베이스에서 메시지를 읽을 때 종료 시간을 처리하는 방법은 무엇입니까? 아직 끝나지 않은 메시지 만 표시하는 경우. – iqpolar

+1

나는 이것에 대한 예제도 추가했다. – Grimthorr

관련 문제