How to save the current date/time when I add new value to Firebase Realtime Database

前端 未结 3 1012
猫巷女王i
猫巷女王i 2020-11-22 05:55

I want to save the current date/time in specific field when I add new value to Firebase Realtime Database via control panel.

How can I achieve that?

Please

相关标签:
3条回答
  • 2020-11-22 06:28

    The best practice is to save your data as a TIMESTAMP like this ServerValue.TIMESTAMP.

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

    Also remember, when you set the TIMESTAMP, you set it as a Map, but when you retrieve it, you retrieve it as a Long. To get the data back, i suggest you use this method:

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

    Edit: The model class should look like this:

    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;}
    }
    

    Remember, ServerValue.TIMESTAMP is just a token that Firebase Realtime Database converts to a number on server side when it's used as a child value during write operation. The date only appears in the database after the write operation completes.

    To get the timestamp, there is also another approach, which would be to write a frunction in Cloud Functions for Firebase and it will be as easy as:

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

    You can host this in Cloud Function and get the server timestamp without user interaction.

    0 讨论(0)
  • 2020-11-22 06:37

    Alex Mamo is right but then this is how you should pass incase you call it from a model class

    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;
        }
    

    Then consume as follows

     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");
                    }
                }
            });
        }
    
    0 讨论(0)
  • 2020-11-22 06:39

    Use data type Number into Firebase.

    1. Store current millis while storing data into Fireabase.
    2. While retrieving data you will get millis which you were stored previously. Parse in into Java Date Instance and work further.
    0 讨论(0)
提交回复
热议问题