6

JavaでFirebaseを使用しています。ユーザーの情報を更新する必要がある場合、次の単純なコードは常に正常に機能します。

final FirebaseBean_User userObject = new FirebaseBean_User(uuid, name, timestamp, points, gamesPlayed, gamesWon);
mFirebaseUser.setValue(userObject, System.currentTimeMillis());

最近オンラインになったすべてのユーザーのリストを取得できるように、現在のタイムスタンプを優先度の値として使用しました。

ただし、ユーザーがオフラインになると、オフラインとしてマークしたいと思います。したがって、途中に 1 つの単純な行を追加しました。

final FirebaseBean_User userObject = new FirebaseBean_User(uuid, name, timestamp, points, gamesPlayed, gamesWon);
mFirebaseUser.onDisconnect().setValue(userObject, USER_PRIORITY_OFFLINE); // best practice: always call onDisconnect() before the actual setValue() operation to prevent ghost data
mFirebaseUser.setValue(userObject, System.currentTimeMillis());

そして突然、このコードは機能しなくなりました。次の例外が発生します。原因となる行 (465) は中央の新しい行です。

FATAL EXCEPTION: main
com.firebase.client.FirebaseException: Failed to parse node with class class com.my.package.MultiplayerService$FirebaseBean_User
    at com.firebase.client.snapshot.NodeUtilities.NodeFromJSON(NodeUtilities.java:130)
    at com.firebase.client.OnDisconnect.setValue(OnDisconnect.java:81)
    at com.my.package.MultiplayerService.updateUserInformation(MultiplayerService.java:465)
    at com.my.package.MultiplayerService.access$4(MultiplayerService.java:461)
    at com.my.package.MultiplayerService$1.onDataChange(MultiplayerService.java:83)
    at com.firebase.client.core.ValueListenerContainer$1.run(ValueListenerContainer.java:50)
    at android.os.Handler.handleCallback(Handler.java:605)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4514)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
    at dalvik.system.NativeStart.main(Native Method)

なぜそれが起こるのですか?私は何か間違ったことをしていますか?つまり、setValue()以前は正常に機能していましたが、今では唯一の変更点は、私もそれを呼び出してonDisconnect()機能しなくなることです。

(その基準点に過去にデータがあったかどうかは問いません。)

参照に使用されるクラスは次のとおりです。

private static class FirebaseBean_User {

    private String uuid;
    private String name;
    private int lastlogin;
    private double points;
    private int gamesplayed;
    private int gameswon;

    private FirebaseBean_User() { }

    public FirebaseBean_User(String uuid, String name, int lastlogin, double points, int gamesplayed, int gameswon) {
        this.uuid = uuid;
        this.name = name;
        this.lastlogin = lastlogin;
        this.points = points;
        this.gamesplayed = gamesplayed;
        this.gameswon = gameswon;
    }

    public String getUuid() {
        return uuid;
    }

    public String getName() {
        return name;
    }

    public int getLastlogin() {
        return lastlogin;
    }

    public double getPoints() {
        return points;
    }

    public int getGamesplayed() {
        return gamesplayed;
    }

    public int getGameswon() {
        return gameswon;
    }

    @Override
    public boolean equals(Object o) {
        return (o instanceof FirebaseBean_User && ((FirebaseBean_User) o).getUuid() == this.uuid);
    }

}
4

2 に答える 2

2

これは実際には Firebase SDK のバグです。申し訳ありません。具体的には、OnDisconnect ハンドラーの問題です。そのため、ref.setValue では機能しますが、ref.onDisconnect().setValue では機能しません。できるだけ早く修正を行い、回答が利用可能になったら更新します。

編集: https://www.firebase.com/docs/downloads.htmlから最新の SDK を取得してみ てください。バージョン 1.0.4 である必要があります。引き続き問題が発生する場合はお知らせください。

于 2013-09-03T18:05:03.017 に答える
0

com.firebase.client.snapshot.NodeUtilities クラスでの JSON 解析の問題のようです。

このクラスに関するドキュメントは見つかりませんでしたが、他のシリアライゼーション/解析エンジンでの私の経験から、FirebaseBean_User(パブリックのように) 空のアクセス可能なコンストラクターがないため、問題はクラスにあると思われます。

ほとんどの解析エンジンはClass<?>.newInstance()、空のコンストラクターを呼び出すオブジェクトをインスタンス化するメソッドを呼び出すことになります。

したがって、次のように変更してみてください。

private FirebaseBean_User() { }

為に:

public FirebaseBean_User() { }
于 2013-08-28T09:41:57.933 に答える