Estoy bloqueado creando una base de datos de Firebase.
Estoy intentando modelar una clase. Una clase muy sencilla:
package com.glups.model;
import com.google.firebase.database.IgnoreExtraProperties;
@IgnoreExtraProperties
public class AlumnoFB {
private String nombre;
private String apellidos;
private String telefono;
private String email;
private Boolean tieneWhatsapp;
private Boolean tieneTelegram;
private Boolean tieneHangouts;
private Long formaPago;
private Double ratioHora;
private Double precioHora;
private Double horasCompensadas;
public AlumnoFB() {
// Default constructor required for calls to DataSnapshot.getValue(User.class)
}
public AlumnoFB(String nombre,
String apellidos,
String telefono,
String email,
Boolean tieneWhatsapp,
Boolean tieneTelegram,
Boolean tieneHangouts,
Long formaPago,
Double ratioHora,
Double precioHora,
Double horasCompensadas) {
this.nombre = nombre;
this.apellidos = apellidos;
this.telefono = telefono;
this.email = email;
this.tieneWhatsapp = tieneWhatsapp;
this.tieneTelegram = tieneTelegram;
this.tieneHangouts = tieneHangouts;
this.formaPago = formaPago;
this.ratioHora = ratioHora;
this.precioHora = precioHora;
this.horasCompensadas = horasCompensadas;
}
}
eso es casi como una clase de muestra de Firebase.
El usuario de la aplicación obtenido de getUser () ha iniciado sesión en Firebase.
Cuando llamo a SetValue:
AlumnoFB alumno = new AlumnoFB("", "", "", "", false, false, false, ((Integer)FormaPago.INT_NO_PAGADO).longValue(), 0.0, 0.0, 0.0);
mDatabase.child("AlumnoFB").child(ControlClasesFirebase.getUser().getUid()).setValue(alumno) ;
Surge una excepción fatal.
06-10 10:17:37.179 13841-13841/com.glups.controlclases E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.glups.controlclases, PID: 13841 com.google.firebase.database.DatabaseException: No properties to serialize found on class com.glups.model.AlumnoFB
at com.google.android.gms.internal.zzaix$zza.<init>(Unknown Source)
at com.google.android.gms.internal.zzaix.zzj(Unknown Source)
at com.google.android.gms.internal.zzaix.zzaw(Unknown Source)
at com.google.android.gms.internal.zzaix.zzav(Unknown Source)
at com.google.firebase.database.DatabaseReference.zza(Unknown Source)
at com.google.firebase.database.DatabaseReference.setValue(Unknown Source)
at com.glups.controlclases.MainActivity$4.onClick(MainActivity.java:305)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5258)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
He comprobado los tipos y todos son aceptados. ¿Qué pasa?
java
android
firebase
firebase-realtime-database
EulerVen
fuente
fuente
Si está utilizando proguard, algunos métodos en el modelo podrían eliminarse según su configuración. Como sabemos que POJO no tiene mucha optimización ya que solo tiene campos con getters y / u (opcionalmente) setters, puede usar la anotación "@Keep" para que proguard no elimine ningún método de esta clase.
Consulte esto para obtener más información: https://developer.android.com/studio/build/shrink-code.html
@Keep public class Store {}
fuente
ProguardTokenType.CRLF, ProguardTokenType.FLAG_NAME , ProguardTokenType.LINE_CMT or ProguardTokenType.WS expected, got '@'
En mi caso, olvidé agregar una regla proguard para mantener las clases modelo:
-keep class com.google.firebase.example.fireeats.model.** { *; }
Esto es lo mismo que la respuesta de @ aselims, solo la versión proguard.
Lo encontré en el ejemplo oficial de Firestore:
https://github.com/firebase/quickstart-android/blob/master/firestore/app/proguard-rules.pro
fuente
Tengo este problema hoy y simplemente lo resuelvo proporcionando getter / setter para variables privadas.
ex:
private String pid; public String getPid() { return pid; } public void setPid(String pid) { this.pid = pid; }
Ahora funciona perfectamente sin ningún error. Espero que ayude a los desarrolladores novatos.
fuente
Declare las variables como públicas.
public String email
fuente
En caso de que alguien se encuentre con esto y ninguna de las soluciones anteriores funcione, las variables declaradas también deben ser de
Object
tipo y no de tipo crudo.Por ejemplo, puede usar
Integer
's pero no puede usarint
' s.Lo mismo es cierto para
boolean
,float
,double
, etc Básicamente, cualquier tipo sin embalaje.fuente
agregando
@ServerTimeStamp public Date date;
me ayudó a resolver el problema
fuente
Puede hacer cualquiera de las dos cosas:
fuente