2014-09-09 5 views
3

Я хотел бы знать, как использовать метод ServerValue.TIMESTAMP Firebase, когда я хочу создать метку времени на сервере Firebase, а затем вернуть ее на локальный клиент.Извлечь ServerValue.Timestamp из Firebase в приложении Android, когда данные отправляются

В справочниках Firebase только javascript имеет более подробное описание этого случая, но мне сложно определить, как перевести это в приложение для Android.

Заранее благодарен!

+0

См http://stackoverflow.com/a/25308684/209103 –

+0

Спасибо, но я хотел бы знать синтаксис в Java, а не Javascript , как в ответе. Любой, кто может перевести этот фрагмент js? :) – user3537089

+0

Это был вопрос Java/Android, но на самом деле этот ответ основан на JavaScript. ОП нашел решение и разместил его, но после его удаления. Может быть, вы все равно можете получить доступ к нему по адресу http://stackoverflow.com/a/25321169/209103 –

ответ

10

Firebase.ServerValue.TIMESTAMP установлен как Map (содержащий {.sv: "timestamp"}), в котором говорится, что Firebase заполняет это поле сервером. Когда эти данные считываются, это фактическая временная метка unix, которая является Long.

Что-то, как это будет работать:

Firebase ref = new Firebase("https://YOUR-FIREBASE.firebaseio.com");  

ref.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
     Long timestamp = (Long) snapshot.getValue(); 
     System.out.println(timestamp); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 

ref.setValue(ServerValue.TIMESTAMP); 

В качестве другого примера, вы можете увидеть мой ответ на этот вопрос: Android chat crashes on DataSnapshot.getValue() for timestamp

+1

Как узнать значение, когда мы делаем 'updateChildren'? –

1

Я знаю, что этот вопрос уже был дан ответ, но я хотел бы поделиться моей версии решения.

Когда я использую временную метку сервера, я обычно нужно использовать его более чем один раз, т.е. у меня есть какие-то startTime и endTime которые оба зависят от времени сервера, где startTime является NOW и endTime составляет X секунд/минут/часов после startTime, поэтому, чтобы сэкономить несколько запросов на сервере, я сохраняю время сервера в корневом дочернем элементе с именем serverTime в базе данных и использую его для установки всех зависимых значений.

Другое дело, поскольку Firebase работает с ServerValue.Timestamp, в итоге он запускает 2 события (добавленные и измененные), первый с локальной меткой времени, а второй с меткой времени реального сервера. Поэтому, чтобы решить проблему не получения правильного времени, я добавил простой OnCompleteListener.

Краткий пример кода:

import android.support.annotation.NonNull; 

import com.google.android.gms.tasks.OnCompleteListener; 
import com.google.android.gms.tasks.Task; 
import com.google.firebase.database.DataSnapshot; 
import com.google.firebase.database.DatabaseError; 
import com.google.firebase.database.DatabaseReference; 
import com.google.firebase.database.ServerValue; 
import com.google.firebase.database.ValueEventListener; 

public class ServerTime { 

    public interface OnTimeRetrievedListener { 

     void onTimeRetrieved(Long timestamp); 
    } 

    private final DatabaseReference db; 

    public ServerTime(DatabaseReference db) { 
     this.db = db.child("serverTime"); 
    } 

    /** 
    * Gets the server's timestamp in milliseconds. 
    * @param listener {@link OnTimeRetrievedListener} 
    */ 
    public void getTime(final OnTimeRetrievedListener listener) { 
     if (listener == null) { 
      return; 
     } 

     db.setValue(ServerValue.TIMESTAMP).addOnCompleteListener(new OnCompleteListener<Void>() { 
      @Override 
      public void onComplete(@NonNull Task<Void> task) { 

       db.addListenerForSingleValueEvent(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         listener.onTimeRetrieved(dataSnapshot.getValue(Long.class)); 
        } 

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

      } 
     }); 
    } 
} 
1

Если вы не хотите писать в базу данных, чтобы выяснить, метку времени, вы можете получить мгновенный приближение его. Работает даже в автономном режиме, и это достаточно хорошо для большинства случаев.

считанное значение

/.info/serverTimeOffset 

и добавить его в new Date().time()

Смежные вопросы