发送数据时,从 Android 应用中的 Firebase 检索 ServerValue.Timestamp

Posted

技术标签:

【中文标题】发送数据时,从 Android 应用中的 Firebase 检索 ServerValue.Timestamp【英文标题】:Retrieve ServerValue.Timestamp from Firebase in Android app, when data is sent 【发布时间】:2014-11-02 20:40:38 【问题描述】:

我想知道如何使用 Firebase 的 ServerValue.TIMESTAMP 方法,当我想在 Firebase 服务器上创建时间戳,然后将其检索到本地客户端。

在 Firebase 指南中,只有 javascript 对此案例有更详细的描述,但我很难弄清楚如何将其转换为我的 android 应用程序。

提前致谢!

【问题讨论】:

见***.com/a/25308684/209103 谢谢,但我想知道 Java 中的语法,而不是 javascript,就像那里的答案一样。谁能翻译那个js sn-p? :) 这是一个 Java/Android 问题,但实际上该答案是基于 JavaScript 的。 OP找到了解决方案并发布了该解决方案,但已将其删除。也许您仍然可以通过***.com/a/25321169/209103 访问它 【参考方案1】:

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

【讨论】:

当我们做updateChildren时如何知道值?【参考方案2】:

我知道这个问题已经得到解答,但我想分享我的解决方案版本。

当我使用服务器的时间戳时,我通常需要多次使用它,即我有某种startTimeendTime,它们都取决于服务器的时间,其中startTimeNOWendTimestartTime 之后 X 秒/分钟/小时,因此为了节省对服务器的多个请求,我将服务器的时间保存在数据库中名为 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)  
                );

            
        );
    

【讨论】:

【参考方案3】:

如果您不想写入数据库来计算时间戳,您可以立即获得它的近似值。甚至可以离线工作,并且对于大多数情况来说已经足够了。

读取值

/.info/serverTimeOffset

并将其添加到new Date().time()

【讨论】:

似乎是一个很好的答案,您能否将您的答案扩展到所有新手。谢谢【参考方案4】:

首先,向 firebase 服务器发送一个对象

FirebaseDatabase.getInstance().getReference("serverTimeTest").setValue(new KKModel());

模型类

class KKModel
    public String someField = "value";
    public Object creationDate = ServerValue.TIMESTAMP;

    public String creationDate() 
        return SimpleDateFormat.getDateInstance(DateFormat.SHORT, Locale.US).format(creationDate);
    

用法

object.creationDate()工作正常测试结果"9/6/18"

【讨论】:

它不工作。该对象无法转换为 DateFormat。 @ranasaha 一旦你将该对象推送到firebase,它就会起作用 抱歉,它不起作用。它会抛出异常。

以上是关于发送数据时,从 Android 应用中的 Firebase 检索 ServerValue.Timestamp的主要内容,如果未能解决你的问题,请参考以下文章

当 sql server 数据库中的数据发生变化时,从一个 android 应用程序向另一个应用程序发送推送通知

休眠后,Android应用程序在kindle fire上关闭

从Android应用程序向服务器发送数据时连接被拒绝[重复]

无法检测从android发送的php中的Post参数

在 kindle fire 上调试安卓应用

如何在 android studio IDE 中开始为 fire os 开发应用程序