Firebase Tidak ada properti untuk membuat serial yang ditemukan di kelas

90

Saya sedang membuat Firebase Database.

Saya mencoba menjadi model kelas. Kelas yang sangat sederhana:

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

itu hampir seperti kelas sampel dari Firebase.

Pengguna aplikasi yang diperoleh dari getUser () telah login di Firebase.

Ketika saya memanggil 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) ;

Pengecualian fatal muncul.

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)

Saya sudah memeriksa jenis, dan semuanya diterima. Apa yang salah?

EulerVen
sumber

Jawaban:

171

Firebase mengharuskan Pojo Anda memiliki variabel publik atau pengambil / penyetel.

Ubah deklarasi variabel menjadi publik

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
sumber
1
Sepertinya logis. Saya belum mendefinisikan getter / setter dan saya biasanya mendefinisikan variabel POJO pribadi saya. Terima kasih!
EulerVen
13
Bahkan dalam contoh dokumen saya menemukan variabel privat digunakan pada kelas untuk basis data firebase seperti 'FriendlyMessage'. Saya menemukan mereka bekerja pada apk debug saya tetapi bukan apk rilis. Mengubah semuanya menjadi publik (dan mendeklarasikan kelas di luar aplikasi utama) memperbaikinya. Selalu ada masalah kecil dengan Android.
Androidcoder
1
Masuk akal untuk menggunakannya sebagai publik. Lol Saya seharusnya tidak lupa bahwa
Bharat
Memiliki semua yang bersifat publik tidak cukup, saya juga perlu memiliki kelas Data di filenya sendiri di luar aplikasi utama seperti yang ditunjukkan oleh komentar kedua
masood elsad
Terima kasih ... Ini memecahkan masalah saya. Tapi saya ingin tahu sesuatu. Pada awalnya variabel dideklarasikan sebagai paket privat tetapi ini tidak menimbulkan masalah. Tetapi ketika saya membuat apk dan menginstal pada perangkat fisik saya menghadapi masalah itu. Kenapa?
Sudipta Basak
99

Jika Anda menggunakan proguard, beberapa metode dalam model dapat dihapus tergantung pada konfigurasi Anda. Seperti yang kita ketahui bahwa tidak ada banyak optimasi pada POJO karena POJO hanya memiliki field dengan getter dan / atau setter (opsional), Anda dapat menggunakan anotasi "@Keep" sehingga proguard tidak akan menghapus metode apapun dari kelas ini.

Periksa ini untuk info lebih lanjut: https://developer.android.com/studio/build/shrink-code.html

@Keep
public class Store {}
aselims
sumber
2
Anda adalah bro penyelamat hidup. Ini benar-benar berfungsi setelah apk ditandatangani.
Smeet
Ini akhirnya menyelesaikan cobaan dan perjuangan 2 hari saya dalam membuat versi 'rilis' aplikasi yang bekerja dengan database firebase. Debug berfungsi dengan baik tetapi Rilis tidak. Seharusnya itu memberi saya petunjuk untuk meragukan Proguard tetapi entah bagaimana saya gagal melakukannya. Terima kasih banyak telah memposting jawabannya!
Wahib Ul Haq
Ketika saya menulis ini di file proguard- rules.pro, saya mendapat kesalahan ini:ProguardTokenType.CRLF, ProguardTokenType.FLAG_NAME , ProguardTokenType.LINE_CMT or ProguardTokenType.WS expected, got '@'
Shruti
Untuk memeriksa apakah aturan proguard Anda berfungsi atau tidak, periksa output di build / outputs / mapping / release / seeds.txt dan build / outputs / mapping / release / usage.txt info selengkapnya di sini developer.android.com/studio/build /shrink-code.html
Ninja420
3

Saya mendapat masalah ini hari ini dan hanya menyelesaikan ini menyediakan pengambil / penyetel untuk variabel pribadi.

ex:

private String pid;

public String getPid() {
    return pid;
}

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

Sekarang berfungsi dengan sempurna tanpa kesalahan apa pun. Semoga ini akan membantu pengembang pemula.

Vishal 16
sumber
0

Deklarasikan variabel sebagai publik.

public String email
Marium Jawed
sumber
0

Jika ada yang mengalami ini dan tidak ada solusi di atas yang berfungsi, variabel yang dideklarasikan juga harus Objectbertipe dan bukan tipe mentah.

Sebagai contoh, Anda dapat menggunakan Integer's tetapi Anda tidak dapat menggunakan int' s.

Hal yang sama berlaku untuk boolean, float, double, dll Pada dasarnya, semua jenis tanpa box.

PGMacDesign
sumber
0

menambahkan

@ServerTimeStamp
public Date date; 

membantu saya menyelesaikan masalah

QDiamond
sumber
0

Anda dapat melakukan salah satu dari dua hal -

  1. Jadikan variabel Anda publik ATAU
  2. Tambahkan getter dan setter untuk semua variabel
abhinavDAIICT
sumber