Firebase Nenhuma propriedade para serializar encontrada na classe

86

Estou bloqueado criando um banco de dados Firebase.

Estou tentando modelar uma classe. Uma aula muito simples:

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;
    }
}

isso é quase como uma classe de amostra do Firebase.

O usuário do aplicativo obtido em getUser () foi conectado ao Firebase.

Quando eu chamo 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) ;

Uma exceção fatal surge.

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)

Verifiquei os tipos e todos são aceitos. O que está errado?

EulerVen
fonte

Respostas:

165

O Firebase exige que seu Pojo tenha variáveis ​​públicas ou getter / setter.

Alterar declarações de variáveis ​​para 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
fonte
1
Parece lógico. Ainda não defini getters / setter e geralmente defino minhas variáveis ​​POJO privadas. Funciona. Obrigado!
EulerVen
13
Mesmo em exemplos de doc, descobri que variáveis ​​privadas foram usadas nas classes do banco de dados Firebase, como 'FriendlyMessage'. Eu descobri que eles funcionaram no meu apk de depuração, mas não no apk de lançamento. Alterar tudo para público (e declarar a classe fora do aplicativo principal) corrigiu isso. Sempre pequenas armadilhas com o Android.
Androidcoder
1
Faz sentido usá-los como públicos. Lol, eu não deveria ter esquecido disso
Bharat
Tendo tudo público não era suficiente, eu também precisava ter a classe Data em seu próprio arquivo fora do aplicativo principal, como o segundo comentário apontou
masood elsad
Obrigado ... Isso resolveu meu problema. Mas eu quero saber uma coisa. A princípio a variável foi declarada como pacote privado, mas isso não estava causando nenhum problema. Mas quando criei o apk e instalei no dispositivo físico, enfrentei esse problema. Por quê ?
Sudipta Basak
97

Se você estiver usando o proguard, alguns métodos no modelo podem ser eliminados dependendo da sua configuração. Como sabemos que não há muita otimização para POJO, pois ele tem apenas campos com getters e / ou (opcionalmente) setters, você pode usar a anotação "@Keep" para que o programa não exclua nenhum método desta classe.

Verifique isso para obter mais informações: https://developer.android.com/studio/build/shrink-code.html

@Keep
public class Store {}
aselims
fonte
1
Você é o irmão salva-vidas. Ele realmente funciona após o apk assinado.
Smeet de
Isso finalmente resolveu minha provação e luta de 2 dias para fazer a versão de 'lançamento' do aplicativo funcionar com o banco de dados firebase. Debug estava funcionando bem, mas Release não. Deveria ter me dado uma dica para duvidar de Proguard, mas de alguma forma não consegui. Muito obrigado por postar a resposta!
Wahib Ul Haq
Quando escrevi isso no arquivo proguard- rules.pro, recebi este erro:ProguardTokenType.CRLF, ProguardTokenType.FLAG_NAME , ProguardTokenType.LINE_CMT or ProguardTokenType.WS expected, got '@'
Shruti
Para verificar se suas regras de programa estão funcionando ou não, verifique a saída em build / outputs / mapping / release / seeds.txt e build / outputs / mapping / release / usage.txt mais informações aqui developer.android.com/studio/build /shrink-code.html
Ninja420
3

Eu tenho esse problema hoje e resolvo isso fornecendo getter / setter para variáveis ​​privadas.

ex:

private String pid;

public String getPid() {
    return pid;
}

public void setPid(String pid) {
    this.pid = pid;
}

Agora está funcionando perfeitamente sem nenhum erro. Espero que ajude os desenvolvedores novatos.

Vishal16
fonte
0

Declare variáveis ​​como públicas.

public String email
Marium Jawed
fonte
0

Caso alguém encontre isso e nenhuma das soluções acima funcione, as variáveis ​​declaradas também precisam ser do Objecttipo e não do tipo bruto.

Por exemplo, você pode usar Integer's, mas não pode usar int' s.

Mesmo é verdadeiro para boolean, float, double, etc. Basicamente, qualquer tipo unboxed.

PGMacDesign
fonte
0

adicionando

@ServerTimeStamp
public Date date; 

me ajudou a resolver o problema

QDiamond
fonte
0

Você pode fazer qualquer uma das duas coisas -

  1. Torne suas variáveis ​​públicas OU
  2. Adicione getters e setters para todas as variáveis
abhinavDAIICT
fonte