Firebase Sınıfta serileştirilecek özellik bulunamadı


90

Firebase Veritabanı oluşturmakla karşılaştım.

Bir sınıfı modellemeye çalışıyorum. Çok basit bir sınıf:

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

bu neredeyse Firebase'in örnek bir sınıfı gibidir.

GetUser () 'dan alınan uygulama kullanıcısı Firebase'de oturum açtı.

SetValue'yu çağırdığımda:

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

Ölümcül bir istisna yükselir.

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)

Türleri kontrol ettim ve hepsi kabul edildi. Sorun nedir?

Yanıtlar:


171

Firebase, Pojo'nuzun genel değişkenlere veya alıcı / ayarlayıcıya sahip olmasını gerektirir .

Değişken bildirimlerini genel olarak değiştirin

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
Mantıklı görünüyor. Henüz alıcıları / ayarlayıcıları tanımlamadım ve genellikle POJO değişkenlerimi özel olarak tanımlıyorum. Teşekkür ederim!
EulerVen

13
Doküman örneklerinde bile firebase veritabanı için 'FriendlyMessage' gibi sınıflarda özel değişkenlerin kullanıldığını gördüm. Hata ayıklama apk'mde çalıştıklarını ancak sürüm apk'sinde çalışmadıklarını buldum. Her şeyi herkese açık hale getirmek (ve sınıfı ana uygulamanın dışında ilan etmek) sorunu çözdü. Android ile her zaman küçük tuzaklar.
Androidcoder

1
Bunları halka açık olarak kullanmak mantıklı. Lol Bunu unutmamalıydım
Bharat

Her şeyin herkese açık olması yeterli değildi, ayrıca ikinci yorumun işaret ettiği gibi Data sınıfını kendi dosyasında ana uygulamanın dışında bulundurmam gerekiyordu
masood elsad

Teşekkürler ... Bu sorunumu çözdü. Ama bir şey bilmek istiyorum. İlk başta değişken paket özel olarak ilan edildi ama bu herhangi bir sorun yaratmıyordu. Ancak apk'yi oluşturup fiziksel cihaza yüklediğimde bu sorunla karşılaştım. Neden ?
Sudipta Başak

99

Proguard kullanıyorsanız, yapılandırmanıza bağlı olarak modeldeki bazı yöntemler çıkarılabilir. POJO'nun yalnızca alıcıları ve / veya (isteğe bağlı olarak) ayarlayıcıları olan alanları olduğu için pek fazla optimizasyon olmadığını bildiğimiz için, "@Keep" notunu kullanabilirsiniz, böylece proguard bu sınıftan herhangi bir yöntemi silmez.

Daha fazla bilgi için bunu kontrol edin: https://developer.android.com/studio/build/shrink-code.html

@Keep
public class Store {}

2
Sen hayat kurtarıcısın kardeşim. İmzalı apk'den sonra gerçekten çalışıyor.
Smeet

Bu, nihayet 2 günlük sıkıntılarımı çözdü ve firebase veritabanıyla çalışan uygulamanın 'yayınlama' sürümünü yapma mücadelemi çözdü. Hata ayıklama iyi çalışıyordu ama Release değildi. Proguard'dan şüphe etmem için bana bir ipucu vermeliydi ama bir şekilde bunu yapamadım. Cevabı gönderdiğiniz için çok teşekkürler!
Wahib Ul Haq

Bunu proguard- rules.pro dosyasına yazdığımda şu hatayı aldım:ProguardTokenType.CRLF, ProguardTokenType.FLAG_NAME , ProguardTokenType.LINE_CMT or ProguardTokenType.WS expected, got '@'
Shruti

Proguard kurallarınızın çalışıp çalışmadığını kontrol etmek için, build / outputs / mapping / release / seeds.txt ve build / outputs / mapping / release / usage.txt içindeki çıktıyı kontrol edin ve buradan daha fazla bilgi edinin developer.android.com/studio/build /shrink-code.html
Ninja420


3

Bugün bu sorunu yaşıyorum ve bunu özel değişkenler için alıcı / ayarlayıcı sağlayarak çözdüm.

ör:

private String pid;

public String getPid() {
    return pid;
}

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

Artık hatasız mükemmel çalışıyor. Umarım yeni başlayan geliştiricilere yardımcı olur.



0

Herhangi biri bununla karşılaşırsa ve yukarıdaki çözümlerden hiçbiri işe yaramazsa, açıklanan değişkenlerin de Objecttürden olması ve ham türler olmaması gerekir .

Örneğin, olabilir kullanmak Integer'ın ancak olamaz kullanmak int' s.

Aynı için de geçerlidir boolean, float, doublevb Temelde, herhangi kutulanmamış tip.


0

ekleme

@ServerTimeStamp
public Date date; 

sorunu çözmeme yardım etti


0

İki şeyden birini yapabilirsiniz -

  1. Değişkenlerinizi herkese açık hale getirin VEYA
  2. Tüm değişkenler için alıcılar ve ayarlayıcılar ekleyin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.