Firebase Nessuna proprietà da serializzare trovata nella classe


90

Sono bloccato a creare un database Firebase.

Sto cercando di modellare una classe. Una classe molto semplice:

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

è quasi come una classe di esempio da Firebase.

L'utente dell'applicazione ottenuto da getUser () è stato connesso a Firebase.

Quando chiamo 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) ;

Si solleva un'eccezione fatale.

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)

Ho controllato i tipi e sono tutti accettati. Cosa c'è che non va?

Risposte:


171

Firebase richiede che il tuo Pojo abbia variabili pubbliche o getter / setter.

Cambia le dichiarazioni delle variabili in pubbliche

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
Sembra logico. Non ho ancora definito getter / setter e di solito definisco private le mie variabili POJO. Funziona. Grazie!
EulerVen

13
Anche negli esempi di documenti ho trovato variabili private utilizzate sulle classi per il database Firebase come "FriendlyMessage". Ho scoperto che funzionavano sul mio apk di debug ma non sull'apk di rilascio. La modifica di tutto in public (e la dichiarazione della classe all'esterno dell'applicazione principale) ha risolto il problema. Sempre piccole insidie ​​con Android.
Androidcoder

1
Ha senso usarli come pubblici. Lol Non avrei dovuto dimenticarlo
Bharat

Avere tutto pubblico non era abbastanza, dovevo anche avere la classe Data nel proprio file al di fuori dell'applicazione principale, come ha sottolineato il secondo commento
masood elsad

Grazie ... Questo ha risolto il mio problema. Ma voglio sapere una cosa. All'inizio la variabile è stata dichiarata come pacchetto privato ma questo non ha creato alcun problema. Ma quando ho creato l'apk e l'ho installato sul dispositivo fisico, ho riscontrato questo problema. Perché ?
Sudipta Basak

99

Se stai usando proguard, alcuni metodi nel modello potrebbero essere eliminati a seconda della tua configurazione. Poiché sappiamo che non c'è molta ottimizzazione in POJO poiché ha solo campi con getter e / o (opzionalmente) setter, puoi usare l'annotazione "@Keep" così proguard non cancellerà alcun metodo da questa classe.

Controlla questo per maggiori informazioni: https://developer.android.com/studio/build/shrink-code.html

@Keep
public class Store {}

2
Sei il fratello salvavita. Funziona davvero dopo l'apk firmato.
Incontro

Questo ha finalmente risolto il mio calvario di 2 giorni e la mia lotta per rendere la versione "release" dell'app funzionante con il database Firebase. Il debug funzionava bene ma il rilascio no. Avrebbe dovuto suggerirmi di dubitare di Proguard, ma in qualche modo non ci sono riuscito. Grazie mille per aver pubblicato la risposta!
Wahib Ul Haq

Quando l'ho scritto nel file proguard- rules.pro, ho ricevuto questo errore:ProguardTokenType.CRLF, ProguardTokenType.FLAG_NAME , ProguardTokenType.LINE_CMT or ProguardTokenType.WS expected, got '@'
Shruti

Per verificare se le tue regole di proguard funzionano o meno, controlla l'output in build / output / mapping / release / seeds.txt e build / output / mapping / release / usage.txt maggiori informazioni qui developer.android.com/studio/build /shrink-code.html
Ninja420

27

Nel mio caso ho dimenticato di aggiungere una regola proguard per mantenere le classi del modello:

-keep class com.google.firebase.example.fireeats.model.** { *; }

Questa è la stessa della risposta di @ aselims, solo la versione proguard.

L'ho trovato nell'esempio ufficiale di firestore:

https://github.com/firebase/quickstart-android/blob/master/firestore/app/proguard-rules.pro


Ho riscontrato lo stesso problema dopo aver creato l'apk con proguard.
Himanshu Shekher Jha

3

Ho questo problema oggi e risolvo questo problema fornendo getter / setter per variabili private.

ex:

private String pid;

public String getPid() {
    return pid;
}

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

Ora funziona perfettamente senza alcun errore. Spero che possa aiutare gli sviluppatori principianti.



0

Nel caso in cui qualcuno si imbatta in questo e nessuna delle soluzioni precedenti funziona, anche le variabili dichiarate devono essere di Objecttipo e non di tipi grezzi.

Ad esempio, puoi usare Integer's ma non puoi usare int' s.

Lo stesso vale per boolean, float, double, ecc Fondamentalmente, qualsiasi tipo unboxed.


0

aggiungendo

@ServerTimeStamp
public Date date; 

mi ha aiutato a risolvere il problema


0

Puoi fare una delle due cose:

  1. Rendi pubbliche le tue variabili OR
  2. Aggiungi getter e setter per tutte le variabili
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.