Firebase Không tìm thấy thuộc tính nào để tuần tự hóa trên lớp


86

Tôi đã rất khó khăn khi tạo Cơ sở dữ liệu Firebase.

Tôi đang cố gắng làm mẫu cho một lớp học. Một lớp rất đơn giản:

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

gần giống như một lớp mẫu từ Firebase.

Người dùng ứng dụng có được từ getUser () đã được đăng nhập trên Firebase.

Khi tôi gọi 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) ;

Một ngoại lệ chết người tăng lên.

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ôi đã kiểm tra các loại và tất cả đều được chấp nhận. Chuyện gì vậy?

Câu trả lời:


165

Firebase yêu cầu Pojo của bạn phải có các biến công khai hoặc getter / setter.

Thay đổi khai báo biến thành công khai

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
Nó có vẻ hợp lý. Tôi vẫn chưa định nghĩa getters / setter và tôi thường xác định các biến POJO của mình là private. Cảm ơn bạn!
EulerVen

13
Ngay cả trong các ví dụ doc, tôi thấy các biến riêng đã được sử dụng trên các lớp cho cơ sở dữ liệu firebase như 'FriendlyMessage'. Tôi thấy họ đã hoạt động trên apk gỡ lỗi của tôi nhưng không phải apk phát hành. Thay đổi mọi thứ thành công khai (và khai báo lớp bên ngoài ứng dụng chính) đã sửa nó. Luôn luôn có ít cạm bẫy với Android.
Androidcoder

1
Nên sử dụng chúng dưới dạng công khai. Tôi không nên quên điều đó
Bharat

Có tất cả mọi thứ nào là không đủ, tôi cũng cần phải có các lớp dữ liệu trong tập tin riêng của mình bên ngoài các ứng dụng chính như nhận xét thứ hai chỉ ra
Masood elsad

Cảm ơn ... Điều này đã giải quyết vấn đề của tôi. Nhưng tôi muốn biết điều gì đó. Lúc đầu, biến được khai báo là gói riêng tư nhưng điều này không gây ra vấn đề gì. Nhưng khi tôi tạo apk và cài đặt trên thiết bị vật lý, tôi gặp phải vấn đề đó. Tại sao ?
Sudipta Basak

97

Nếu bạn đang sử dụng proguard, một số phương pháp trong mô hình có thể bị loại bỏ tùy thuộc vào cấu hình của bạn. Như chúng ta biết rằng không có nhiều tối ưu hóa cho POJO vì nó chỉ có các trường với bộ định tuyến và / hoặc (tùy chọn), bạn có thể sử dụng chú thích "@Keep" để proguard sẽ không xóa bất kỳ phương thức nào khỏi lớp này.

Kiểm tra phần này để biết thêm thông tin: https://developer.android.com/studio/build/shrink-code.html

@Keep
public class Store {}

1
Bạn là người tiết kiệm cuộc sống. Nó thực sự hoạt động sau khi apk đã ký.
Smeet

Điều này cuối cùng đã giải quyết được thử thách và đấu tranh trong 2 ngày của tôi để làm cho phiên bản 'phát hành' của ứng dụng hoạt động với cơ sở dữ liệu firebase. Gỡ lỗi hoạt động tốt nhưng Bản phát hành thì không. Đáng lẽ ra, tôi nên nghi ngờ Proguard nhưng bằng cách nào đó, tôi không làm được. Cảm ơn rất nhiều vì đã đăng câu trả lời!
Wahib Ul Haq

Khi tôi viết điều này trong tập tin rules.pro proguard-, tôi đã nhận lỗi này:ProguardTokenType.CRLF, ProguardTokenType.FLAG_NAME , ProguardTokenType.LINE_CMT or ProguardTokenType.WS expected, got '@'
Shruti

Để kiểm tra xem các quy tắc proguard của bạn có hoạt động hay không, hãy kiểm tra đầu ra trong build / outputs / mapping / release / seed.txt và build / outputs / mapping / release / use.txt. Thông tin thêm tại đây developer.android.com/studio/build /shrink-code.html
Ninja420,

27

Trong trường hợp của tôi, tôi đã quên thêm quy tắc proguard để giữ các lớp mô hình:

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

Đây giống như câu trả lời của @ aselims, chỉ là phiên bản proguard.

Tôi tìm thấy nó trong ví dụ về cửa hàng cứu hỏa chính thức:

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


Tôi cũng gặp vấn đề tương tự sau khi tạo apk bằng proguard.
Himanshu Shekher Jha 23/07/18

3

Tôi đã gặp sự cố này hôm nay và chỉ cần giải quyết vấn đề này bằng cách cung cấp getter / setter cho các biến riêng.

Ví dụ:

private String pid;

public String getPid() {
    return pid;
}

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

Bây giờ nó hoạt động hoàn hảo mà không có bất kỳ lỗi nào. Hy vọng nó sẽ giúp ích cho các dev mới.



0

Trong trường hợp bất kỳ ai gặp phải vấn đề này và không có giải pháp nào ở trên hoạt động, các biến được khai báo cũng cần phải là Objectkiểu chứ không phải kiểu thô.

Ví dụ, bạn có thể sử dụng Integer's nhưng bạn không thể sử dụng int' s.

Điều này cũng đúng cho boolean, float, double, vv Về cơ bản, bất kỳ loại không có hộp bọc.


0

thêm vào

@ServerTimeStamp
public Date date; 

đã giúp tôi giải quyết vấn đề


0

Bạn có thể làm một trong hai điều -

  1. Đặt các biến của bạn ở chế độ công khai HOẶC
  2. Thêm getters và setters cho tất cả các biến
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.