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?

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;

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

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.



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.


0

adicionando

@ServerTimeStamp
public Date date; 

me ajudou a resolver o problema


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.