android - Firebase ServerValue.TIMESTAMP en objetos de modelos de datos Java
(6)
Así es como lo hago
//member variable
Object createdTimestamp;
public YourConstructor(){
createdTimestamp = ServerValue.TIMESTAMP
}
@Exclude
public long getCreatedTimestampLong(){
return (long)createdTimestamp;
}
Soy nuevo en Firebase, y lo he estado disfrutando mucho hasta ahora. Me encuentro con un problema; Estoy usando el FirebaseListAdapter similar al esquema del tutorial aquí: https://github.com/firebase/AndroidChat
Para usar FirebaseListAdapter, necesito usar objetos de modelo de datos (para que el enlace automático funcione bien). El problema es que también quiero mantener un valor de marca de tiempo con ese objeto modelo, y quiero obtener la marca de tiempo del servidor Firebase.
Lo que tengo actualmente que NO funciona es una clase DataModelObject (similar a com.firebase.androidchat.Chat en el ejemplo de demostración) con un constructor como:
DataModelObject(String data1, String data2, Map enQTimeStamp)
que luego trato de usar así:
DataModelObject dmo = new DataModelObject ("foo", "bar", ServerValue.TIMESTAMP);
myFirebaseRef.push().setValue(dmo);
Esto provoca una JsonMappingException cuando intento ejecutar ese código. Encontré un fragmento de código aquí:
https://www.firebase.com/blog/2015-02-11-firebase-unique-identifiers.html
Pero vale la pena señalar que en la línea 4 del ejemplo del código de Android, eso provocará un error de tiempo de compilación (ya que está tratando de poner ServerValue.TIMESTAMP en un mapa, y TIMESTAMP es un mapa en sí)
¿Cuál es la forma correcta de hacer esto y mantener la compatibilidad con FirebaseListAdapter?
Esto suena similar a esta pregunta: al hacer un POJO en Firebase, ¿puedes usar ServerValue.TIMESTAMP?
Al crear POJOs utilizados para almacenar / recuperar datos aparte del constructor vacío predeterminado, generalmente uso un constructor similar a este:
Param param1;
Param param2;
HashMap<String, Object> timestampCreated;
//required empty constructor
public DataObject(){}
public DataObject(Param param1, Param param2) {
this.param1 = param1;
this.param2 = param2;
HashMap<String, Object> timestampNow = new HashMap<>();
timestampNow.put("timestamp", ServerValue.TIMESTAMP);
this.timestampCreated = timestampNow;
}
Asegúrese de incluir un captador para el HashMap <> utilizado para almacenar la Marca de tiempo:
public HashMap<String, Object> getTimestampCreated(){
return timestampCreated;
}
Luego, use la anotación @Exclude para crear un captador que pueda usar en su código para obtener el valor de la marca de tiempo si lo necesita. La anotación @Exclude hará que Firebase ignore este captador y no busque una propiedad correspondiente
@Exclude
public long getTimestampCreatedLong(){
return (long)timestampCreated.get("timestamp");
}
Kotlin proporciona una manera fácil de lograr esto mediante clases de datos. Puedes crearlo como
data class FirebaseRequestModel(
var start_time: Any = ServerValue.TIMESTAMP,
var stop_time: Long = 0,
var total_time: Long = 0,
)
y úsalo directamente por
val firebaseModel = FirebaseRequestModel()
firebaseRef.setValue(firebaseModel)
Esto obtendrá valores predeterminados de la clase de datos.
O incluso puede iniciar sus propios valores al
val firebaseModel = FirebaseRequestModel(ServerValue.TIMESTAMP, 2134, 0)
firebaseRef.setValue(firebaseModel)
Puedes hacerlo:
public class MyTimeStamp {
private Object timestamp;
public MyTimeStamp() {
}
public Object getTimestamp() {
return timestamp;
}
public void setTimestamp(Object timestamp) {
this.timestamp = timestamp;
}
}
Y entonces:
public static void start(Context context) {
MyTimeStamp timeStamp = new MyTimeStamp();
timeStamp.setTimestamp(ServerValue.TIMESTAMP);
Log.d(TAG, "start: ", timeStamp.getTimestamp().toString());
}
Similar a la respuesta de Urgurcan, pero un poco más limpia para que la persona que llama no tenga problemas para adivinar entre getTimestamp vs timetamp.
public class FirebaseDbObject {
private Object timestamp = ServerValue.TIMESTAMP;
//........
//........
@PropertyName("timestamp")
Object getRawTimestamp() {
return timestamp;
}
@Exclude
public long getTimestamp() {
return (long) timestamp;
}
}
Su objeto db debe incluir estos:
public class FirebaseDbObject {
private final Object timestamp = ServerValue.TIMESTAMP;
//........
//........
Object getTimestamp() {
return timestamp;
}
@Exclude
public long timestamp() {
return (long) timestamp;
}
}
Esto agregará un campo adicional llamado "marca de tiempo" a su objeto.
Editar: La respuesta publicada por MobileMon no es completamente correcta ya que no tiene el método getter. Esta es la respuesta completa y correcta.