2013-08-23 9 views
6

Używam Firebase w Javie. Poniższy prosty kod zawsze działało dobrze, gdy informacje ytkowników musiały zostać zaktualizowane:FirebaseException: Nie można przeanalizować węzła za pomocą klasy w NodeUtilities.NodeFromJSON

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

użyłem aktualny timestamp jako wartość priorytetu tak, że mogę uzyskać listę wszystkich użytkowników, które zostały niedawno w Internecie.

Jednakże, gdy użytkownik przechodzi w tryb offline, chciałbym oznaczyć je jako offline. W związku z tym dodałem ponownie jedną prostą linię pośrodku:

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

I nagle ten fragment kodu przestał działać. Otrzymuję następujący wyjątek, w którym linia powodująca (465) jest nowa w środku:

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) 

Dlaczego tak się dzieje? Czy robię coś złego? To znaczy, setValue() działało dobrze wcześniej, teraz jedyną zmianą jest to, że nazywam je również onDisconnect() i przestaje działać.

(To nie ma znaczenia, czy doszło do danych w tym punkcie odniesienia przed lub nie).

Oto klasa, która jest wykorzystywana w celach:

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

Wygląda na to, że onDisconnect nie może parsować obiektu FirebaseBean_User (userObject) do lub z łańcucha JSON. –

+0

Tak, jest to oczywiste przez wyrażenie "wyjątek", które jest wyrzucane (_into_ JSON), ale pytanie brzmi: dlaczego tak właśnie jest. Jak widać, 'onDisconnect(). SetValue()' i 'setValue()' piszą ten sam obiekt do węzła referencyjnego, ale z 'setValue()' to działa iz 'onDisconnect() .setValue() '(tylko 1 wiersz wcześniej), to nie działa. Czemu? – caw

+0

Jaka jest wartość USER_PRIORITY_OFFLINE? Zgaduję, że silnik nie jest w stanie przetworzyć tego na prawidłowy JSON. – Anant

Odpowiedz

0

Wydaje się JSON analizowania problemów , w klasie com.firebase.client.snapshot.NodeUtilities.

Nie znalazłem żadnego dokumentu na temat tej klasy, ale z mojego doświadczenia z innymi silnikami serializującymi/analizującymi, podejrzewam, że problem leży w klasie FirebaseBean_User z powodu braku pustego, dostępnego (jak w publicznym) konstruktora .

Większość analizowanych silników kończy się wywoływaniem metody Class<?>.newInstance(), która tworzy instancję wywołującą pusty konstruktor.

Więc spróbuj zmienić:

private FirebaseBean_User() { } 

dla:

public FirebaseBean_User() { } 
+0

Dzięki, ale to się nie zmienia _nie rzeczy_. Teraz utworzyłem klasę 'FirebaseBean_User' oddzielną klasą (nie zagnieżdżoną) i upubliczniłem wszystkie konstruktory, metody i pola - bez zmian. Ponadto prywatny domyślny konstruktor był dokładnie taki, jak sugeruje to Firebase, patrz pierwszy przykład kodu (Java) tutaj: https://www.firebase.com/docs/managing-lists.html – caw

+0

OK. Przepraszam, że nie pomogłem. –

+1

Nie ma problemu :) Twoja sugestia wydawała się całkowicie uzasadniona, a ponieważ nic nie działa, domyślam się, że jest to błąd w pakiecie SDK Firebase. – caw

2

Jest to w istocie błąd w Firebase SDK, przepraszam! W szczególności jest to problem w procedurze obsługi OnDisconnect. Dlatego działa na wartość ref.setValue, ale nie ref.onDisconnect(). SetValue. Dostarczę poprawkę ASAP i zaktualizuję odpowiedź, gdy tylko będzie dostępna.

Edytuj: spróbuj pobrać najnowsze SDK z https://www.firebase.com/docs/downloads.html Powinna być wersja 1.0.4. Daj mi znać, jeśli nadal będziesz mieć problemy.

+0

Nadal stoi ten sam problem, Wyjątek: 'com.firebase.client.FirebaseException: Nie udało się przeanalizować węzła za pomocą klasy klasy MY_CLASS_NAME', próbuję zapisać jako:' ref.child ("users"). Child (encodeEmail (mEmail)). setValue (encodeEmail (mEmail), użytkownik); ', zauważ, że robię to po raz pierwszy po utworzeniu projektu w Firebase. –

+0

@ShajeelAfzal Mam do czynienia z tym samym problemem z metodą setValue (.., ..). Czy możesz go rozwiązać? –

Powiązane problemy