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
.
- Autenticación de Firebase en el sitio web de wordpress
- Análisis de Android Firebase Analytics Eventos personalizados en la consola
- Firebase Cloud Messaging colapse_key no se ha recibido (tasa limitada?)
- Esperaba un mapa mientras se deserializaba, pero obtuvo una clase java.lang.Long
- Cómo obtener mediante programación la lista de usuarios registrados en Firebase
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?
- ¿Cómo almacenar datos en base de datos en tiempo real en firebase durante el registro de usuario?
- Firebase cómo enviar notificación de tema
- Android Firebase - "onDataChange" y "onCancelled" no se llaman sin conexión a Internet
- Firebase Crash informe de correo electrónico
- Quiero fijar una prioridad calculada usando el timestamp del servidor proporcionado por Firebase
- Firebase Android encontrar amigos característica
- Filtrar una vista de reciclaje con un regulador de ciclos de fuego
- El método SetProviders está marcado como desaconsejado
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; } }
- Usando el descompilador jd-gui de java y obteniendo // ERROR INTERNO //
- Cómo ocultar la barra de la tecla de función en el teléfono Android?