2013-08-23 9 views
6

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

} 
+0

Sembra che onDisconnect non possa analizzare l'oggetto FirebaseBean_User (userObject) in o da una stringa JSON. –

+0

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

+0

Qual è il valore di USER_PRIORITY_OFFLINE? Immagino che il motore non sia in grado di analizzarlo in JSON valido. – Anant

risposta

0

Mi sembra un problema di analisi JSON , alla classe com.firebase.client.snapshot.NodeUtilities.

Non ho trovato alcun documento su questa classe, ma dalla mia esperienza con altri motori di serializzazione/analisi, ho il sospetto che il problema si trova sulla tua classe , a causa della mancanza di un costruttore vuoto accessibile (come in pubblico) .

La maggior parte dei motori di analisi termina una chiamata al metodo Class<?>.newInstance(), che istanzia l'oggetto richiamando il costruttore vuoto.

Quindi, prova a cambiare:

private FirebaseBean_User() { } 

per:

public FirebaseBean_User() { } 
+0

Grazie, ma questo non cambia _ tutto. Ora ho reso la classe 'FirebaseBean_User' una classe separata (non più nidificata) e reso pubblici tutti i costruttori, i metodi e i campi - nessuna modifica. Inoltre, il costruttore privato predefinito era esattamente il modo in cui Firebase suggerisce di farlo, vedere il primo esempio di codice (Java) qui: https://www.firebase.com/docs/managing-lists.html – caw

+0

OK. Mi dispiace non aver aiutato. –

+1

Nessun problema :) Il tuo suggerimento sembrava perfettamente ragionevole, e poiché nulla sembra funzionare, immagino sia un bug nell'SDK di Firebase. – caw

2

Questo è infatti un bug nel Firebase SDK, mi dispiace! In particolare, si tratta di un problema nel gestore OnDisconnect. Ecco perché funziona per ref.setValue, ma non ref.onDisconnect(). SetValue. Prenderò una soluzione insieme APPENA POSSIBILE e aggiornerò la mia risposta una volta disponibile.

Modifica: prova ad acquisire l'ultimo SDK da https://www.firebase.com/docs/downloads.html Dovrebbe essere la versione 1.0.4. Fammi sapere se continui ad avere problemi.

+0

Ancora lo stesso problema, Eccezione è: 'com.firebase.client.FirebaseException: Impossibile analizzare il nodo con la classe classe MY_CLASS_NAME', Sto cercando di salvare come:' ref.child ("users"). Child (encodeEmail (mEmail)). setValue (encodeEmail (mEmail), utente); ', tieni presente che lo sto facendo per la prima volta dopo aver creato il progetto su Firebase. –

+0

@ShajeelAfzal Sto affrontando lo stesso problema con il metodo setValue (.., ..). Potresti risolverlo? –

Problemi correlati