2013-08-23 4 views
6

Java에서 Firebase를 사용하고 있습니다. 사용자의 정보가 업데이트되어야했다 때 다음과 같은 간단한 코드는 항상 잘 작동하고있다 : 나는 온라인으로 최근 된 모든 사용자의 목록을 얻을 수 있도록 FirebaseException : NodeUtilities.NodeFromJSON의 클래스로 노드를 구문 분석하지 못했습니다.

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

나는 우선 순위 값으로 현재의 타임 스탬프를 사용했다.

그러나 사용자가 오프라인 상태가되면 오프라인으로 표시하려고합니다. 따라서 중간에 하나의 단순한 줄을 추가했습니다.이 코드 조각이 갑자기 작동을 멈췄습니다. 나는 다음과 같은 Exception을 얻었습니다. 원인이되는 라인 (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); 
    } 

} 
+0

onDisconnect는 FirebaseBean_User (userObject) 객체를 JSON 문자열로 또는 JSON 문자열에서 구문 분석 할 수없는 것으로 보입니다. –

+0

예, 이것은 Throw 된 Exception (_into_ JSON)에 의해 명백합니다. 그러나 질문은 _why_입니다. 정확하게 이것은 그렇습니다. 보시다시피, onDisconnect(). setValue()와 setValue()는 참조 노드에 같은 객체를 쓰지만'setValue()'와'onDisconnect(). setValue() '(전에 한 줄만), 작동하지 않습니다. 왜? – caw

+0

USER_PRIORITY_OFFLINE의 값은 무엇입니까? 나는 엔진이 그것을 유효한 JSON으로 파싱 할 수 없다고 추측하고있다. – Anant

답변

0

그것은 JSON 파싱 문제가 보인다 com.firebase.client.snapshot.NodeUtilities 클래스에 있습니다.

이 클래스에 대한 문서를 찾지 못했지만 다른 직렬화/구문 분석 엔진을 사용한 경험으로 비어있는 accesible (공용) 생성자가 없어서 FirebaseBean_User 클래스에 문제가 있다고 의심됩니다. .

대부분의 구문 분석 엔진은 결국 Class<?>.newInstance() 메서드를 호출하여 빈 생성자를 호출하는 개체를 인스턴스화합니다.

그래서, 변경 시도 :

private FirebaseBean_User() { } 

을 위해 :

public FirebaseBean_User() { } 
+0

감사합니다. 그러나 이것은 변경되지 않습니다. 나는 이제'FirebaseBean_User' 클래스를 별도의 클래스 (더 이상 중첩되지 않음)로 만들고 모든 생성자, 메소드 및 필드를 public으로 만들었습니다. 변경하지 않았습니다. 게다가 private 기본 생성자는 Firebase이 제안한 것과 정확히 일치합니다 (Java의 첫 번째 코드 예 : https://www.firebase.com/docs/managing-lists.html – caw

+0

). 미안해하지 않았다. –

+1

문제 없음 :) 귀하의 제안은 완벽하게 합리적인 것처럼 보였습니다. 아무 것도 작동하지 않기 때문에, Firebase SDK에 버그가 있다고 생각합니다. – caw

2

이 사실 인 중포 기지 SDK의 버그, 미안! 특히 OnDisconnect 핸들러의 문제입니다. 그래서 ref.setValue는 작동하지만 ref.onDisconnect(). setValue는 작동하지 않습니다. 최대한 빨리 해결할 수 있고 사용 가능하면 답변을 업데이트 할 것입니다.

편집 : https://www.firebase.com/docs/downloads.html 에서 최신 SDK를 가져와보세요. 버전 1.0.4 여야합니다. 계속 문제가 있으면 알려주세요.

+0

여전히 동일한 문제에 직면하고 있습니다 : 예외 :'com.firebase.client.FirebaseException : 클래스 class MY_CLASS_NAME로 노드를 파싱하지 못했습니다.''ref.child ("users"). child (encodeEmail() mEmail)) .setValue (encodeEmail (mEmail), user);', Firebase에서 프로젝트를 생성 한 후 처음으로이 작업을 수행하고 있습니다. –

+0

@ShajeelAfzal 나는 setValue (.., ..) 메소드에서 같은 문제에 직면 해있다. 그것을 해결할 수 있습니까? –

관련 문제