Firebase У класі не знайдено властивостей для серіалізації


86

Мене блокує створення бази даних 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)

Я перевірив типи, і всі приймаються. Що не так?

Відповіді:


165

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. Це працює. Дякую!
EulerVen

13
Навіть у прикладах doc я знайшов, що приватні змінні використовувались у класах для бази даних firebase, таких як 'FriendlyMessage'. Я виявив, що вони працювали над моїм apk для налагодження, але не з apk для випуску. Змінивши все на загальнодоступне (і оголосивши клас поза основним додатком) це виправлено. Завжди маленькі підводні камені з Android.
Androidcoder

1
Є сенс використовувати їх як загальнодоступні. Лол, я не повинен був про це забувати
Бхарат,

Маючи все загальнодоступне, мені також потрібно було мати клас даних у своєму власному файлі поза основною програмою, на що вказував другий коментар
masood elsad,

Дякую ... Це вирішило мою проблему. Але я хочу щось знати. Спочатку змінна була оголошена як приватний пакет, але це не створювало жодних проблем. Але коли я створив apk і встановив його на фізичному пристрої, я зіткнувся з цією проблемою. Чому?
Судіпта Басак,

97

Якщо ви використовуєте proguard, деякі методи в моделі можуть бути вилучені залежно від вашої конфігурації. Оскільки ми знаємо, що для POJO не існує великої оптимізації, оскільки він має лише поля з геттерами та / або (за бажанням) сеттерами, ви можете використовувати анотацію "@Keep", щоб proguard не видаляв будь-які методи з цього класу.

Перевірте це для отримання додаткової інформації: https://developer.android.com/studio/build/shrink-code.html

@Keep
public class Store {}

1
Ти рятувальник життя, брате. Це дійсно працює після підписаного apk.
Smeet

Це нарешті вирішило моє дводенне випробування та боротьбу за те, щоб "випустити" версію програми, яка працює з базою даних firebase. Налагодження працювало нормально, але Реліз ні. Це мало дати мені натяк сумніватися в Proguard, але я якось не зміг цього зробити. Велике спасибі за розміщення відповіді!
Wahib Ul Haq

Коли я написав це у файлі proguard- rules.pro, у мене з'явилася така помилка:ProguardTokenType.CRLF, ProguardTokenType.FLAG_NAME , ProguardTokenType.LINE_CMT or ProguardTokenType.WS expected, got '@'
Shruti

Щоб перевірити, чи працюють ваші правила proguard, перевірте вихідні дані у build / outputs / mapping / release / seed.txt та build / outputs / mapping / release / usage.txt. Більше інформації тут: developer.android.com/studio/build /shrink-code.html
Ninja420

27

У моєму випадку я забув додати правило proguard, щоб зберегти класи моделей:

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

Це те саме, що відповідь @ aselims, просто версія proguard.

Я знайшов це в офіційному прикладі firestore:

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


Я отримав ту ж проблему після створення apk з proguard.
Himanshu Shekher Jha

3

У мене сьогодні виникла ця проблема, і я просто вирішую цю проблему, яка надає getter / setter для приватних змінних.

напр .:

private String pid;

public String getPid() {
    return pid;
}

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

Тепер це працює ідеально без помилок. Сподіваюся, це допоможе новачкам розробникам.



0

У випадку, якщо хтось стикається з цим, і жодне з наведених вище рішень не працює, оголошені змінні також повинні мати Objectтип, а не необроблені типи.

Наприклад, ви можете використовувати Integer's, але ви не можете використовувати int' s.

Те ж саме вірно і для boolean, float, doubleі т.д. У принципі, будь-який Unboxed типу.


0

додавання

@ServerTimeStamp
public Date date; 

допомогло мені вирішити проблему

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.