Firebase W klasie nie znaleziono żadnych właściwości do serializacji

86

Mam problemy z tworzeniem bazy danych Firebase.

Próbuję modelować klasę. Bardzo prosta klasa:

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

to prawie jak przykładowa klasa z Firebase.

Użytkownik aplikacji uzyskany z getUser () został zalogowany do Firebase.

Kiedy dzwonię do 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) ;

Pojawia się fatalny wyjątek.

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)

Sprawdziłem typy i wszystkie są akceptowane. Co jest nie tak?

EulerVen
źródło

Odpowiedzi:

165

Firebase wymaga, aby Pojo miało zmienne publiczne lub pobierające / ustawiające.

Zmień deklaracje zmiennych na publiczne

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
źródło
1
Wydaje się to logiczne. Nie zdefiniowałem jeszcze getters / setter i zazwyczaj definiuję zmienne POJO private.To działa. Dziękuję Ci!
EulerVen,
13
Nawet w przykładach w dokumentach odkryłem, że zmienne prywatne były używane w klasach bazy danych Firebase, takich jak „FriendlyMessage”. Okazało się, że działali na moim apk do debugowania, ale nie na apk wydania. Zmiana wszystkiego na publiczne (i zadeklarowanie klasy poza główną aplikacją) naprawiła to. Zawsze małe pułapki z Androidem.
Androidcoder,
1
Warto używać ich jako publicznych. Lol Nie powinienem był o tym zapomnieć
Bharat
Ponieważ wszystko było publiczne, musiałem również mieć klasę Data we własnym pliku poza główną aplikacją, jak wskazał drugi komentarz
masood elsad
Dzięki ... To rozwiązało mój problem. Ale ja chcę coś wiedzieć. Początkowo zmienna została zadeklarowana jako pakiet prywatny, ale nie stanowiło to żadnego problemu. Ale kiedy utworzyłem apk i zainstalowałem go na urządzeniu fizycznym, napotkałem ten problem. Czemu ?
Sudipta Basak
97

Jeśli używasz programu proguard, niektóre metody w modelu mogą zostać usunięte w zależności od konfiguracji. Ponieważ wiemy, że POJO nie wymaga zbytniej optymalizacji, ponieważ ma tylko pola z pobierającymi i / lub (opcjonalnie) ustawiającymi, możesz użyć adnotacji „@Keep”, aby program Proguard nie usuwał żadnych metod z tej klasy.

Sprawdź to, aby uzyskać więcej informacji: https://developer.android.com/studio/build/shrink-code.html

@Keep
public class Store {}
aselims
źródło
1
Jesteś bratem ratującym życie. To naprawdę działa po podpisaniu apk.
Smeet
To ostatecznie rozwiązało moją dwudniową próbę i walkę z wprowadzeniem wersji „wydania” aplikacji do współpracy z bazą danych Firebase. Debugowanie działało dobrze, ale wydanie nie. Powinienem był dać wskazówkę, żebym wątpił w Proguarda, ale jakoś mi się to nie udało. Wielkie dzięki za wysłanie odpowiedzi!
Wahib Ul Haq
Kiedy napisałem to w pliku proguard- rules.pro, otrzymałem ten błąd:ProguardTokenType.CRLF, ProguardTokenType.FLAG_NAME , ProguardTokenType.LINE_CMT or ProguardTokenType.WS expected, got '@'
Shruti
Aby sprawdzić, czy Twoje reguły proguard działają, czy nie, sprawdź dane wyjściowe w build / output / mapping / release / seeds.txt i build / output / mapping / release / usage.txt więcej informacji tutaj developer.android.com/studio/build /shrink-code.html
Ninja420
3

Mam dziś ten problem i po prostu rozwiązuję go, dostarczając getter / setter dla zmiennych prywatnych.

dawny:

private String pid;

public String getPid() {
    return pid;
}

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

Teraz działa doskonale bez żadnego błędu. Mam nadzieję, że pomoże to początkującym deweloperom.

Vishal16
źródło
0

Zadeklaruj zmienne jako publiczne.

public String email
Marium Jawed
źródło
0

W przypadku, gdyby ktoś wpadł na to i żadne z powyższych rozwiązań nie działa, zadeklarowane zmienne również muszą być Objecttypu, a nie typu surowego.

Na przykład możesz użyć Integer's, ale nie możesz użyćint ' s.

To samo dotyczy boolean, float, double, itd. W zasadzie dowolnego typu bez opakowania.

PGMacDesign
źródło
0

dodanie

@ServerTimeStamp
public Date date; 

pomógł mi rozwiązać problem

QDiamond
źródło
0

Możesz zrobić jedną z dwóch rzeczy -

  1. Udostępnij zmienne publicznie LUB
  2. Dodaj metody pobierające i ustawiające dla wszystkich zmiennych
abhinavDAIICT
źródło