向 Firebase 实时数据库添加新值时如何保存当前日期/时间

Posted

技术标签:

【中文标题】向 Firebase 实时数据库添加新值时如何保存当前日期/时间【英文标题】:How to save the current date/time when I add new value to Firebase Realtime Database 【发布时间】:2017-09-20 21:47:32 【问题描述】:

当我通过控制面板向 Firebase 实时数据库添加新值时,我想将当前日期/时间保存在特定字段中。

我怎样才能做到这一点?

请帮帮我。

【问题讨论】:

发布您的代码以解决您的问题 【参考方案1】:

最佳做法是将您的数据保存为TIMESTAMP,例如ServerValue.TIMESTAMP

DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
Map map = new HashMap();
map.put("timestamp", ServerValue.TIMESTAMP);
ref.child("yourNode").updateChildren(map);

还请记住,当您设置TIMESTAMP 时,您将其设置为Map,但是当您检索它时,您将其检索为Long。要取回数据,我建议您使用这种方法:

public static String getTimeDate(long timestamp)
    try
        DateFormat dateFormat = getDateTimeInstance();
        Date netDate = (new Date(timestamp));
        return dateFormat.format(netDate);
     catch(Exception e) 
        return "date";
    

编辑:模型类应如下所示:

public class YourModelClass 
    //private fields
    private Map<String, String> timestamp;

    public YourModelClass() 

    //public setters and getters for the fields

    public void setTimestamp(Map<String, String> timeStamp) this.timestamp= timestamp;
    public Map<String, String> getTimestamp() return timestamp;

请记住,ServerValue.TIMESTAMP 只是一个令牌,当它在写入操作期间用作子值时,Firebase 实时数据库将其转换为服务器端的数字。日期只有在写操作完成后才会出现在数据库中。

要得到timestamp,还有另一种方法,就是在Cloud Functions for Firebase中写一个函数,就这么简单:

exports.currentTime = functions.https.onRequest((req, res) => 
    res.send("timestamp":new Date().getTime())
)

您可以将其托管在 Cloud Function 中,无需用户交互即可获取服务器时间戳

【讨论】:

非常感谢您的回答,希望能解决我的问题。 我投了反对票,因为存储的值 bn 是一个如图所示的对象...".sv=timestamp" 很抱歉投反对票你是对的但现在你必须提醒guyz模型应该有公共地图时间;在类声明中 @Goodlife 是的,你是对的。我刚刚用模型类更新了答案。希望您重新考虑支持答案。谢谢! @NoorHossain 请就这个特殊案例发布一个新问题。【参考方案2】:

Alex Mamo 是对的,但如果你从模型类中调用它,那么这就是你应该通过的方式

public class FirebMessage 
    public String message;
    public String senderPhoneNumber;
    public String receiverPhoneNumber;
    public Map time;

    public FirebMessage() 
    

    public FirebMessage(String message, String senderPhoneNumber, String receiverPhoneNumber, Map time) 
        this.message = message;
        this.senderPhoneNumber = senderPhoneNumber;
        this.receiverPhoneNumber = receiverPhoneNumber;
        this.time = time;
    

然后如下消费

 private void writeNewMessage(String message, String receiver,String sender) 

        FirebMessage firebMessage = new FirebMessage(message, receiver,sender,ServerValue.TIMESTAMP);
        mDatabase.child("messages").push().setValue(firebMessage, new DatabaseReference.CompletionListener() 
            @Override
            public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) 
                if (databaseError != null) 
                   Log.e(TAG,"Data Not saved");

                 else 
                    Log.e(TAG,"Data saved successfully");
                
            
        );
    

【讨论】:

【参考方案3】:

在 Firebase 中使用数据类型 Number。

    在将数据存储到 Fireabase 时存储当前毫秒。 在检索数据时,您将获得之前存储的毫秒。 解析成 Java 日期实例并进一步工作。

【讨论】:

感谢您的帮助,您能用代码解释一下吗? 我已添加步骤。只要按照这些步骤,你一定会得到结果。 但是我将如何根据millis进行查询......startAt()endAt()不要取long值。

以上是关于向 Firebase 实时数据库添加新值时如何保存当前日期/时间的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 创建 Access 数据库并不断向其中保存实时数据

通过向已有默认值的 TextField 输入新值来更新存储在 Firebase 上的数据

在 Firebase 实时数据库中,当我更新值时,它会立即恢复为旧值

如何构建 Firebase 实时数据库?

如何保存多个谷歌地图标记,它们在 Firebase 实时数据库中的位置,并在打开应用程序时再次显示它们

当我尝试在 Android SQLite 数据库中添加新值时,我的应用程序退出 [重复]