Firebase ไม่พบคุณสมบัติที่จะทำให้เป็นอนุกรมในคลาส


90

ฉันกำลังสร้างฐานข้อมูล 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)

ฉันได้ตรวจสอบประเภทแล้วและทั้งหมดได้รับการยอมรับ มีอะไรผิดปกติ

คำตอบ:


171

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 ของฉันแบบส่วนตัวมันใช้งานได้ ขอขอบคุณ!
EulerVen

13
แม้แต่ในตัวอย่างเอกสารฉันพบว่ามีการใช้ตัวแปรส่วนตัวในคลาสสำหรับฐานข้อมูล firebase เช่น 'FriendlyMessage' ฉันพบว่ามันใช้งานได้กับ apk debug ของฉัน แต่ไม่ใช่ apk ที่วางจำหน่าย การเปลี่ยนทุกอย่างเป็นสาธารณะ (และการประกาศคลาสนอกแอปพลิเคชันหลัก) ได้รับการแก้ไขแล้ว ข้อผิดพลาดเล็กน้อยเสมอกับ Android
Androidcoder

1
ควรใช้เป็นแบบสาธารณะ ฮ่า ๆ ฉันไม่ควรลืมว่า
Bharat

การมีทุกอย่างเป็นสาธารณะไม่เพียงพอฉันต้องมีคลาสข้อมูลในไฟล์ของตัวเองนอกแอปพลิเคชันหลักตามที่ความคิดเห็นที่สองชี้ให้เห็น
masood elsad

ขอบคุณ ... นี่ช่วยแก้ปัญหาของฉันได้ แต่ฉันอยากรู้อะไรบางอย่าง ในตอนแรกตัวแปรถูกประกาศว่าเป็นแพ็คเกจส่วนตัว แต่ก็ไม่ได้สร้างปัญหาใด ๆ แต่เมื่อฉันสร้าง apk และติดตั้งบนอุปกรณ์จริงฉันประสบปัญหานั้น ทำไม?
Sudipta Basak

99

หากคุณใช้ proguard วิธีการบางอย่างในรุ่นนี้อาจถูกตัดออกโดยขึ้นอยู่กับการกำหนดค่าของคุณ ดังที่เราทราบว่าไม่มีการเพิ่มประสิทธิภาพให้กับ POJO มากนักเนื่องจากมีเฉพาะฟิลด์ที่มี getters และ / หรือ (เป็นทางเลือก) setters คุณสามารถใช้คำอธิบายประกอบ "@Keep" ดังนั้น proguard จะไม่ลบเมธอดใด ๆ จากคลาสนี้

ตรวจสอบข้อมูลเพิ่มเติมได้ที่https://developer.android.com/studio/build/shrink-code.html

@Keep
public class Store {}

2
คุณคือผู้ช่วยชีวิต มันใช้งานได้จริงหลังจากลงนาม apk
Smeet

ในที่สุดสิ่งนี้ก็ช่วยแก้ปัญหาความเจ็บปวดและปัญหา 2 วันของฉันในการทำให้แอปเวอร์ชัน 'วางจำหน่าย' ทำงานกับฐานข้อมูล firebase ได้ การดีบักทำงานได้ดี แต่ Release ไม่ทำงาน ควรให้คำใบ้ให้ฉันสงสัย 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 / seeds.txt และ build / outputs / mapping / release / usage.txt ข้อมูลเพิ่มเติมที่นี่developer.android.com/studio/build /shrink-code.html
Ninja420

27

ในกรณีของฉันฉันลืมเพิ่มกฎโปรการ์ดเพื่อเก็บคลาสโมเดล:

-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ฯลฯ โดยทั่วไปประเภทไม่มีกล่องใด ๆ



0

คุณสามารถทำอย่างใดอย่างหนึ่งจากสองสิ่ง -

  1. ทำให้ตัวแปรของคุณเป็นแบบสาธารณะหรือ
  2. เพิ่ม getters และ setters สำหรับตัวแปรทั้งหมด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.