2016-06-10 4 views
44

Jestem zaklęty tworząc bazę danych Firebase.Firebase Brak właściwości do serializowania znalezionego na klasie

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

która jest prawie jak klasa próbki z Firebase.

Użytkownik aplikacji otrzymany z getUser() został zalogowany w Firebase.

Kiedy zadzwonić 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) ; 

krytyczny wyjątek budzi.

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?

Odpowiedz

83

Firebase wymaga, aby Twój Pojo posiadał publiczne zmienne lub getter/setter.

Zmiany deklaracje zmiennych do publicznego

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

Wydaje się logiczne. Jeszcze nie zdefiniowałem getter/setter i zazwyczaj definiuję moje zmienne POJO private.It działa. Dziękuję Ci! – EulerVen

+6

Nawet w przykładach dokumentów znalazłem prywatne zmienne używane w klasach dla bazy danych bazy danych typu "FriendlyMessage". Zauważyłem, że pracowali nad moim pakietem debugowania, ale nie na wersji APK. Zmiana wszystkiego na publiczną (i deklarowanie klasy poza główną aplikacją) naprawiła to. Zawsze małe pułapki z Androidem. – Androidcoder

+0

Ma sens używać ich jako publicznych. Lol Nie powinienem był zapomnieć, że – bharath

37

Jeśli używasz ProGuard niektóre metody w modelu mogą być usuwane na zewnątrz w zależności od konfiguracji. Jak wiemy, nie ma zbytniej optymalizacji dla POJO, ponieważ ma ona tylko pola z getterami i/lub (opcjonalnie) seterami, możesz użyć adnotacji "@Keep", więc proguard nie usunie ż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 {} 
+3

Dude, kocham cię! – Usman

+0

Wielkie dzięki, człowieku –

+1

Ty jesteś bri oszczędzającym życie. To naprawdę działa po podpisanym apk. – Smeet