Al hacer un POJO en Firebase, ¿puedes usar ServerValue.TIMESTAMP?

Cuando está haciendo un Objeto Java Antiguo llano que está destinado a ser serializado y deserializado a Firebase, ¿hay una manera de utilizar el valor ServerValue.TIMESTAMP ?

Por ejemplo, digamos que quiero tener un objeto donde una de las propiedades es la última vez que se editó y desea usar el valor ServerValue.TIMESTAMP .

En la clase POJO, usted podría tener:

 private String timeLastChanged; 

o

 private Map<String, String> timeLastChanged; 

En el primer ejemplo con la String , me encuentro con el problema de establecer timeLastChange = ServerValue.TIMESTAMP; , Porque ServerValue.TIMESTAMP es un mapa.

En el segundo ejemplo con el Map<String, String> obtengo un error de "fallo al debounce" porque no puede deserializar correctamente el largo almacenado en la base de datos en un Map<String, String> . ¿Hay algún trabajo alrededor para esto?

Actualización 12/27/2016

Desconectado @ JsonIgnore para @Exclude como muchos han mencionado.


Finalmente llegué con una solución flexible para trabajar con Dates y ServerValue.TIMESTAMP. Esto está funcionando de ejemplos de Ivan V , Ossama , y puf .

No pude encontrar una forma de tratar la conversión entre HashMap<String, String> , pero si anidamos la propiedad en un HashMap<String, Object> más genérico HashMap<String, Object> puede ir a la base de datos como una sola Valor ("fecha", "1443765561874") o como el mapa hash ServerValue.TIMESTAMP ("fecha", {".sv", "servidor"}). Entonces cuando usted lo saca, será siempre un HashMap con ("fecha", "un cierto número largo"). A continuación, puede crear un método auxiliar en su clase POJO utilizando la anotación @JsonIgnore @Exclude (lo que significa que Firebase la ignorará y no la tratará como un método para serializar a / de la base de datos) para obtener fácilmente el valor largo del HashMap devuelto a Utilizar en su aplicación.

Ejemplo completo de una clase de POJO está abajo:

 import com.google.firebase.database.Exclude; import com.firebase.client.ServerValue; import java.util.HashMap; import java.util.Map; public class ExampleObject { private String name; private String owner; private HashMap<String, Object> dateCreated; private HashMap<String, Object> dateLastChanged; /** * Required public constructor */ public ExampleObject() { } public ExampleObject(String name, String owner, HashMap<String,Object> dateCreated) { this.name = name; this.owner = owner; this.dateCreated = dateCreated; //Date last changed will always be set to ServerValue.TIMESTAMP HashMap<String, Object> dateLastChangedObj = new HashMap<String, Object>(); dateLastChangedObj.put("date", ServerValue.TIMESTAMP); this.dateLastChanged = dateLastChangedObj; } public String getName() { return name; } public String getOwner() { return owner; } public HashMap<String, Object> getDateLastChanged() { return dateLastChanged; } public HashMap<String, Object> getDateCreated() { //If there is a dateCreated object already, then return that if (dateCreated != null) { return dateCreated; } //Otherwise make a new object set to ServerValue.TIMESTAMP HashMap<String, Object> dateCreatedObj = new HashMap<String, Object>(); dateCreatedObj.put("date", ServerValue.TIMESTAMP); return dateCreatedObj; } // Use the method described in https://stackoverflow.com/questions/25500138/android-chat-crashes-on-datasnapshot-getvalue-for-timestamp/25512747#25512747 // to get the long values from the date object. @Exclude public long getDateLastChangedLong() { return (long)dateLastChanged.get("date"); } @Exclude public long getDateCreatedLong() { return (long)dateCreated.get("date"); } } 

Quería mejorar la respuesta de Lyla un poco. En primer lugar, me gustaría deshacerme de los métodos public HashMap<String, Object> getDateLastChanged() public HashMap<String, Object> getDateCreated() . Para ello puede marcar la propiedad @JsonProperty con la anotación @JsonProperty . Otra forma posible de hacerlo es cambiar la detección de propiedades de la siguiente manera: @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
En segundo lugar, no entiendo por qué necesitamos poner ServerValue.TIMESTAMP en HashMap mientras que podemos almacenarlos como propiedad. Así que mi código final es:

 import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.firebase.client.ServerValue; public class ShoppingList { private String listName; private String owner; @JsonProperty private Object created; public ShoppingList() { } public ShoppingList(String listName, String owner) { this.listName = listName; this.owner = owner; this.created = ServerValue.TIMESTAMP; } public String getListName() { return listName; } public String getOwner() { return owner; } @JsonIgnore public Long getCreatedTimestamp() { if (created instanceof Long) { return (Long) created; } else { return null; } } @Override public String toString() { return listName + " by " + owner; } } 

Esa solución parece un poco difícil para mí, ya que no sé lo que está haciendo @ JsonIgnore. Traté de hacerlo de una manera fácil y parece que funciona.

 private Object dateLastChanged; public Object getDateLastChanged() { return dateLastChanged; } 

Para obtener algo legible por el ser humano, acabo de pasar el valor devuelto dateLastChanged objeto en el siguiente método mediante su conversión en Long.

 static String convertTime(Long unixtime) { Date dateObject = new Date(unixtime); SimpleDateFormat dateFormatter = new SimpleDateFormat("dd-MM-yy hh:mmaa"); return dateFormatter.format(dateObject); } 

Bienvenido a las opiniones sobre mi solución ^ ^

En lugar de usar @JsonIgnore, puede usar el @Exclude nativo de Firebase. Por ejemplo, trabajo en un proyecto similar y mi modelo es así.

 package com.limte.app.borrador_1.mModel; import com.google.firebase.database.Exclude; import com.google.firebase.database.ServerValue; /** * Created by Familia on 20/12/2016. */ public class ChatItem { String chatName; Long creationDate; public ChatItem() { } public String getChatName() { return chatName; } public void setChatName(String chatName) { this.chatName = chatName; } public java.util.Map<String, String> getCreationDate() { return ServerValue.TIMESTAMP; } @Exclude public Long getCreationDateLong() { return creationDate; } public void setCreationDate(Long creationDate) { this.creationDate = creationDate; } } 

Y este código funciona! En Firebase, los resultados son: Resultados

La misma solución, pero yo uso esto.

 @IgnoreExtraProperties public class FIRPost { Object timestamp; public FIRPost() { // Default constructor required for calls to DataSnapshot.getValue(FIRPost.class) this.timestamp = ServerValue.TIMESTAMP; } public Object getTimestamp() { return timestamp; } @Exclude public Long getTimestamp(boolean isLong) { if (timestamp instanceof Long) return (Long) timestamp; else return null; } } 
  • ¿Alguien tiene la indexación de aplicaciones Firebase para trabajar?
  • Fallo de autenticación anónima de Firebase a través de datos móviles
  • Acceso al objeto principal al detectar un cambio en un valor de subnodo
  • Cross-plataforma de texto, imagen, video Chatear para Android, iOS y Web utilizando Firebase / Parse / PubNub
  • Firebase Cloud Messaging - Android: haga clic en la acción de notificación cuando se cierra la aplicación no funciona
  • Sumar los datos del firebase eficientemente
  • Firebase (FCM) cómo obtener el token
  • No hay un método estático zzUr () en Firebase cuando intento utilizar Analytics con notificaciones
  • Obtener el último elemento en la base de datos anidada firebase android
  • Cómo guardar información de ubicación en Firebase
  • Mi dispositivo no recibe otra notificación (FCM)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.