Sto utilizzando Firebase in Java. Il semplice codice seguente ha sempre funzionato bene quando le informazioni degli utenti ha dovuto essere aggiornato:FirebaseException: impossibile analizzare il nodo con classe in NodeUtilities.NodeFromJSON
final FirebaseBean_User userObject = new FirebaseBean_User(uuid, name, timestamp, points, gamesPlayed, gamesWon);
mFirebaseUser.setValue(userObject, System.currentTimeMillis());
ho usato il timestamp corrente come il valore di priorità in modo che io possa avere una lista di tutti gli utenti che sono stati in linea di recente.
Tuttavia, quando gli utenti passano offline, desidero contrassegnarli come offline. Così, ho aggiunto una riga semplice nel mezzo:
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());
E improvvisamente questo pezzo di codice ha smesso di funzionare. Sto ottenendo il seguente eccezione, dove la linea che causa (465) è il nuovo nel mezzo:
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)
Perché succede questo? Sto facendo qualcosa di sbagliato? Voglio dire, setValue()
ha funzionato bene prima, ora l'unico cambiamento è che lo chiamo allo onDisconnect()
e smette di funzionare.
(non importa se c'è stato dati a quel punto di riferimento prima o non.)
Qui è la classe che viene utilizzata come riferimento:
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);
}
}
Sembra che onDisconnect non possa analizzare l'oggetto FirebaseBean_User (userObject) in o da una stringa JSON. –
Sì, questo è ovvio dall''eccezione 'che viene lanciata (_into_ JSON), ma la domanda è _perché_ esattamente questo è così. Come potete vedere, 'onDisconnect(). SetValue()' e 'setValue()' stanno scrivendo lo stesso oggetto sul nodo di riferimento, ma con 'setValue()' funziona, e con 'onDisconnect(). SetValue() '(solo 1 riga prima), non funziona. Perché? – caw
Qual è il valore di USER_PRIORITY_OFFLINE? Immagino che il motore non sia in grado di analizzarlo in JSON valido. – Anant