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