2016-06-10 31 views
44

我很生氣創建Firebase數據庫。Firebase沒有要在類中找到的序列化屬性

我想模擬一個類。一個非常簡單的類:

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

這幾乎就像來自Firebase的示例類。

從getUser()獲取的應用程序用戶已登錄到Firebase。

當我打電話的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) ; 

嚴重異常升高。

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) 

我檢查過類型,並且都被接受。怎麼了?

回答

83

Firebase要求您的Pojo擁有公共變量或getter/setter。

變化的變量聲明公共

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

這似乎是合乎邏輯的。我還沒有定義getters/setter,我通常定義我的POJO變量private.It的作品。謝謝! – EulerVen

+6

即使在doc示例中,我發現在Firebase數據庫的類(如「FriendlyMessage」)上使用了私有變量。我發現他們在我的調試版APK上工作,但沒有發佈apk。將所有內容改爲public(並在主應用程序之外聲明該類)將其修正。 Android始終沒有什麼隱患。 – Androidcoder

+0

將它們作爲公共使用是有意義的。大聲笑我不應該忘記 – bharath

37

如果您使用ProGuard,模型中的一些方法可以根據您的配置被剝離出來。由於我們知道POJO沒有太多優化,因爲它只有getter和/或(可選)setter字段,所以可以使用註釋「@Keep」,這樣proguard不會從該類中刪除任何方法。

檢查本作的詳細信息:https://developer.android.com/studio/build/shrink-code.html

@Keep 
public class Store {} 
+3

老兄我愛你! – Usman

+0

非常感謝你 –

+1

你是救星兄弟。它簽署apk後真的有效。 – Smeet

相關問題