Firebase No se encontraron propiedades para serializar en la clase

86

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?

EulerVen
fuente

Respuestas:

165

Firebase requiere que tu Pojo tenga variables públicas o getter / setter.

Cambiar declaraciones de variables a públicas

public String nombre;
public String apellidos;
public String telefono;
public String email;
public Boolean tieneWhatsapp;
public Boolean tieneTelegram;
public Boolean tieneHangouts;
public Long formaPago;
public Double ratioHora;
public Double precioHora;
public Double horasCompensadas;
Shubhank
fuente
1
Parece lógico. Todavía no he definido getters / setter y normalmente defino mis variables POJO como privadas. ¡Gracias!
EulerVen
13
Incluso en ejemplos de documentos, encontré que se usaban variables privadas en las clases para la base de datos de base de fuego como 'FriendlyMessage'. Descubrí que funcionaban en mi apk de depuración pero no en el apk de lanzamiento. Cambiar todo a público (y declarar la clase fuera de la aplicación principal) lo solucionó. Siempre pequeños escollos con Android.
Androidcoder
1
Tiene sentido usarlos como públicos. Lol, no debería haberlo olvidado
Bharat
Tener todo en público no era suficiente, también necesitaba tener la clase de datos en su propio archivo fuera de la aplicación principal, como señaló el segundo comentario
masood elsad
Gracias ... Esto resolvió mi problema. Pero quiero saber algo. Al principio, la variable se declaró como paquete privado, pero esto no suponía ningún problema. Pero cuando creé el apk y lo instalé en un dispositivo físico, me enfrenté a ese problema. Por qué ?
Sudipta Basak
97

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 {}
aselims
fuente
1
Eres el hermano salvavidas. Realmente funciona después de una apk firmada.
Smeet
Esto finalmente resolvió mi terrible experiencia de 2 días y la lucha de hacer que la versión de 'lanzamiento' de la aplicación funcione con la base de datos de firebase. La depuración funcionaba bien, pero la versión no. Debería haberme dado una pista para dudar de Proguard, pero de alguna manera no lo hice. ¡Muchas gracias por publicar la respuesta!
Wahib Ul Haq
Cuando escribí esto en el archivo proguard- rules.pro, recibí este error:ProguardTokenType.CRLF, ProguardTokenType.FLAG_NAME , ProguardTokenType.LINE_CMT or ProguardTokenType.WS expected, got '@'
Shruti
Para verificar si sus reglas proguard están funcionando o no, verifique la salida en build / outputs / mapping / release / seeds.txt y build / outputs / mapping / release / uses.txt más información aquí developer.android.com/studio/build /shrink-code.html
Ninja420
3

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.

Vishal16
fuente
0

Declare las variables como públicas.

public String email
Marium Jawed
fuente
0

En caso de que alguien se encuentre con esto y ninguna de las soluciones anteriores funcione, las variables declaradas también deben ser de Objecttipo y no de tipo crudo.

Por ejemplo, puede usar Integer's pero no puede usar int' s.

Lo mismo es cierto para boolean, float, double, etc Básicamente, cualquier tipo sin embalaje.

PGMacDesign
fuente
0

agregando

@ServerTimeStamp
public Date date; 

me ayudó a resolver el problema

QDiamond
fuente
0

Puede hacer cualquiera de las dos cosas:

  1. Haga públicas sus variables O
  2. Agregue captadores y definidores para todas las variables
abhinavDAIICT
fuente