Firebase In der Klasse wurden keine zu serialisierenden Eigenschaften gefunden

84

Ich bin beim Erstellen einer Firebase-Datenbank überfordert.

Ich versuche eine Klasse zu modellieren. Eine sehr einfache Klasse:

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

Das ist fast wie eine Beispielklasse von Firebase.

Der von getUser () erhaltene Anwendungsbenutzer wurde in Firebase angemeldet.

Wenn ich SetValue aufrufe:

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

Eine fatale Ausnahme wird ausgelöst.

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)

Ich habe Typen überprüft und alle werden akzeptiert. Was ist los mit dir?

EulerVen
quelle

Antworten:

163

Für Firebase muss Ihr Pojo über öffentliche Variablen oder Getter / Setter verfügen .

Ändern Sie Variablendeklarationen in public

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
quelle
1
Es scheint logisch zu sein. Ich habe Getter / Setter noch nicht definiert und definiere meine POJO-Variablen normalerweise als privat. Es funktioniert. Danke dir!
EulerVen
13
Sogar in Dokumentbeispielen fand ich, dass private Variablen für die Klassen für die Firebase-Datenbank wie 'FriendlyMessage' verwendet wurden. Ich fand, dass sie an meinem Debug-Apk arbeiteten, aber nicht an dem Release-Apk. Durch Ändern von "public" (und Deklarieren der Klasse außerhalb der Hauptanwendung) wurde das Problem behoben. Immer kleine Fallstricke mit Android.
Androidcoder
1
Es ist sinnvoll, sie als öffentlich zu nutzen. Lol ich hätte das nicht vergessen sollen
Bharat
Da nicht alles öffentlich genug war, musste ich die
Datenklasse auch
Danke ... Das hat mein Problem gelöst. Aber ich möchte etwas wissen. Zuerst wurde die Variable als Paket privat deklariert, was jedoch kein Problem darstellte. Aber als ich die apk erstellt und auf einem physischen Gerät installiert habe, war ich mit diesem Problem konfrontiert. Warum ?
Sudipta Basak
95

Wenn Sie Proguard verwenden, können einige Methoden im Modell abhängig von Ihrer Konfiguration entfernt werden. Da wir wissen, dass POJO nicht viel optimiert wird, da es nur Felder mit Gettern und / oder (optional) Setzern enthält, können Sie die Anmerkung "@Keep" verwenden, damit proguard keine Methoden aus dieser Klasse löscht.

Überprüfen Sie dies für weitere Informationen: https://developer.android.com/studio/build/shrink-code.html

@Keep
public class Store {}
Aselims
quelle
1
Du bist der Lebensretter, Bruder. Es funktioniert wirklich nach signierter apk.
Smeet
Dies löste schließlich meine zweitägige Tortur und meinen Kampf, die 'Release'-Version der App mit der Firebase-Datenbank funktionieren zu lassen. Das Debuggen funktionierte gut, das Release jedoch nicht. Es hätte mir einen Hinweis geben sollen, an Proguard zu zweifeln, aber irgendwie habe ich es versäumt. Vielen Dank für die Antwort!
Wahib Ul Haq
Als ich dies in die Datei proguard- rules.pro schrieb, bekam ich diesen Fehler:ProguardTokenType.CRLF, ProguardTokenType.FLAG_NAME , ProguardTokenType.LINE_CMT or ProguardTokenType.WS expected, got '@'
Shruti
Um zu überprüfen, ob Ihre Proguard-Regeln funktionieren oder nicht, überprüfen Sie die Ausgabe in Build / Outputs / Mapping / Release / Seeds.txt und Build / Outputs / Mapping / Release / Use.txt. Weitere Informationen finden Sie hier. Developer.android.com/studio/build /shrink-code.html
Ninja420
26

In meinem Fall habe ich vergessen, eine Proguard-Regel hinzuzufügen, um die Modellklassen beizubehalten:

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

Dies ist das Gleiche wie die Antwort von @ aselims, nur die Proguard-Version.

Ich habe es im offiziellen Firestore-Beispiel gefunden:

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

Mahmudul Hasan Shohag
quelle
Ich bekam das gleiche Problem, nachdem ich apk mit proguard erstellt hatte.
Himanshu Shekher Jha
3

Ich habe dieses Problem heute und löse es einfach, indem ich Getter / Setter für private Variablen bereitstelle.

Ex:

private String pid;

public String getPid() {
    return pid;
}

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

Jetzt funktioniert es einwandfrei. Hoffe, es wird Neulingen Entwicklern helfen.

Vishal16
quelle
0

Deklarieren Sie Variablen als öffentlich.

public String email
Marium Jawed
quelle
0

Falls jemand darauf stößt und keine der oben genannten Lösungen funktioniert, müssen die deklarierten Variablen ebenfalls vom ObjectTyp und nicht vom Rohtyp sein.

Zum Beispiel, Sie können verwenden Integerist , aber Sie können nicht verwenden int's.

Gleiches gilt für boolean, float, doubleusw. Im Grunde genommen jeder unboxed Typ.

PGMacDesign
quelle
0

Hinzufügen

@ServerTimeStamp
public Date date; 

hat mir geholfen, das Problem zu lösen

QDiamond
quelle