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 были общедоступные переменные или геттер / сеттер.

Измените объявления переменных на общедоступные

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
Вроде логично. Я еще не определил геттеры / сеттеры и обычно определяю свои переменные POJO закрытыми. Это работает. Спасибо!
EulerVen

13
Даже в примерах документации я обнаружил, что частные переменные использовались в классах для базы данных firebase, например FriendlyMessage. Я обнаружил, что они работали над моим отладочным apk, но не над выпуском apk. Изменение всего на публичное (и объявление класса вне основного приложения) исправило это. Всегда маленькие подводные камни с Android.
Androidcoder

1
Имеет смысл использовать их как публичные. Lol, я не должен был забывать об этом
Бхарат

Недостаточно иметь все общедоступное, мне также нужно было иметь класс Data в отдельном файле вне основного приложения, как указано во втором комментарии
masood elsad

Спасибо ... Это решило мою проблему. Но я хочу кое-что знать. Сначала переменная была объявлена ​​как частный пакет, но это не создавало никаких проблем. Но когда я создал apk и установил его на физическое устройство, я столкнулся с этой проблемой. Зачем ?
Sudipta Basak

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 / output / mapping / release / seed.txt и build / output / 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

Сегодня у меня возникла эта проблема, и я просто решаю ее, предоставляя геттер / сеттер для частных переменных.

пример:

private String pid;

public String getPid() {
    return pid;
}

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

Теперь он работает отлично, без ошибок. Надеюсь, это поможет новичкам.



0

Если кто-то столкнется с этим и ни одно из вышеперечисленных решений не сработает, объявленные переменные также должны быть Objectтипа, а не необработанного типа.

Например, вы можете использовать Integer«s , но вы не можете использовать int» с.

То же самое верно и для boolean, float, doubleи т.д. В принципе, любой Unboxed типа.


0

добавление

@ServerTimeStamp
public Date date; 

помог мне решить проблему


0

Вы можете сделать одно из двух:

  1. Сделайте ваши переменные общедоступными ИЛИ
  2. Добавьте геттеры и сеттеры для всех переменных
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.