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 2016年

13
ドキュメントの例でも、「FriendlyMessage」のようなFirebaseデータベースのクラスでプライベート変数が使用されていることがわかりました。私は彼らが私のデバッグapkで動作したが、リリースapkでは動作しなかったことがわかりました。すべてをパブリックに変更する(そしてメインアプリケーションの外部でクラスを宣言する)ことで修正されました。Androidでは常に小さな落とし穴があります。
Androidcoder 2016

1
それらをパブリックとして使用することは理にかなっています。笑私はそれを忘れてはいけません
バーラト

すべてを公開するだけでは不十分でした。2番目のコメントが指摘したように、メインアプリケーションの外部にある独自のファイルにDataクラスを
含める必要もありまし

ありがとう...これは私の問題を解決しました。しかし、私は何かを知りたいです。最初、変数はパッケージプライベートとして宣言されましたが、これは問題になりませんでした。しかし、apkを作成して物理デバイスにインストールすると、その問題に直面しました。どうして ?
Sudipta Basak 2018

97

proguardを使用している場合、構成によっては、モデル内の一部のメソッドが削除される可能性があります。POJOにはゲッターや(オプションで)セッターを含むフィールドしかないため、最適化があまり行われていないことがわかっているので、アノテーション「@Keep」を使用して、proguardがこのクラスからメソッドを削除しないようにすることができます。

詳細については、こちらを確認してください:https//developer.android.com/studio/build/shrink-code.html

@Keep
public class Store {}

1
あなたは命の恩人です。それは署名されたapkの後に本当に機能します。
2017年

これにより、アプリの「リリース」バージョンをFirebaseデータベースで動作させるという2日間の試練と苦労がようやく解決しました。デバッグは正常に機能していましたが、リリースは機能しませんでした。Proguardを疑うヒントが得られたはずですが、どういうわけか私はそうしませんでした。回答を投稿していただきありがとうございます!
Wahib Ul Haq 2017

これをproguard-rules.proファイルに書き込んだときに、次のエラーが発生しました:ProguardTokenType.CRLF, ProguardTokenType.FLAG_NAME , ProguardTokenType.LINE_CMT or ProguardTokenType.WS expected, got '@'
Shruti 2017

プロガードルールが機能しているかどうかを確認するには、build / outputs / Mapping / release /seeds.txtの出力とbuild / outputs / Mapping / release /usage.txtの詳細を確認してください。詳細はこちらdeveloper.android.com/studio/build /shrink-code.html
Ninja4

27

私の場合、モデルクラスを保持するためのプロガードルールを追加するのを忘れました。

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

これは@aselimsの回答と同じですが、バージョンを保護するだけです。

私はそれを公式の消防署の例で見つけました:

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


proguardでapkを作成した後、同じ問題が発生していました。
Himanshu ShekherJha18年

3

私は今日この問題を抱えており、プライベート変数にゲッター/セッターを提供することでこれを解決します。

例:

private String pid;

public String getPid() {
    return pid;
}

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

これで、エラーなしで完全に機能します。それが初心者の開発者に役立つことを願っています。



0

誰かがこれに遭遇し、上記の解決策のいずれも機能しない場合、宣言された変数もObject生の型ではなく型である必要があります。

たとえば、あなたがすることができます使用するIntegerのをしかし、あなたがすることはできません使用しますint

同じことが当てはまりますbooleanfloatdouble、など基本的には、任意のアンボクシングタイプ。


0

追加

@ServerTimeStamp
public Date date; 

問題を解決するのに役立ちました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.