2017-11-08 10 views
0

私はアンドロイドアプリケーション用にFirebaseを使用してデータベースを実装しています。 User.classAddress.class、アプリで使用して::私は2つの豆提示DataSnapshotからオブジェクトを取得する際のエラー

ので

@IgnoreExtraProperties 
public class User { 

    @Exclude 
    private String idAccount; 
    private String firstname; 
    private String lastname; 
    private String pseudo; 
    private Address address; 
    private List<Qualification> qualification; 
    private boolean isWorker; 

    // Constructors + getters + setters 

} 

public class Address { 

    private String houseNumber; 
    private String street; 
    private String city; 
    private String zip; 
    private String country; 

    // Constructors + getters + setters 

} 

を、私はusersRefが私であるusersRef.child(idUser).setValue(user)でデータベースにユーザを追加することができますデータベース内のユーザーの参照(See result

また、でユーザーを取得することもできます:

 Query query = usersRef.child(idUser); 
     query.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       User user = dataSnapshot.getValue(User.class); 
       result.call(user); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       throw databaseError.toException(); 
      } 
     }); 

See result

だから、今すべてが動作しているために!

usersRef.addChildEventListener(new ChildEventListener() { 

      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

       User user = dataSnapshot.getValue(User.class); // crash here 
       } 
      } 

      ... 

} 

致命的な例外:PID:29470 com.google.firebase.database.DatabaseException:

しかし、私は私のusersRefChildEventListenerを置くしようとした場合、私はクラッシュを持つことができます」 t java.lang.String型のオブジェクト をca.uqac.sosdoit.data.Addressと入力すると、 com.google.android.gms.internal.zzear.zzb(不明な情報源) (com.google.android.gms) .internal.zzear.zza(不明な情報源) com.google.android.gms.internal.zzear.zzb(不明な情報源) com.google.android.gms.internal.zzeas.zze(不明な情報源) com.google.android.gms.internal.zzear .zzb(不明な情報源) com.google.android.gms.internal.zzear.zza(不明な情報源) com.google.firebase.database.DataSnapshot.getValue(不明な情報源) ca.uqac.sosdoit .database.DatabaseManager $ 1.onChildAdded(DatabaseManager.java:68) com.google.android.gms.internal.zzdri.zza(不明な情報源) com.google.android.gms.internal.zzdwu.zzbvb(不明ソース) 、com.google.android.gms.internal.zz dxa.run(Unknown Source) (アンドロイド.os.Handler.handleCallback(Handler.java:808) at android.os.Handler.dispatchMessage(Handler.java:103) at android.os.Looper.loop(Looper .java:193) android.app.ActivityThread.main(ActivityThread.java:5292) at java.lang.reflect.Method.invokeNative(ネイティブメソッド) at java.lang.reflect.Method.invoke(Method。 Javaの:515) com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:824) でcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) でのDalvikでシステム.NativeSタルト。メイン(ネイティブメソッド)

そして、私は絶対に理由

+1

「Map valueMap =(HashMap )dataSnapshot.getValue();」を使用してデバッグし、アドレスノードを探してみます。 – xRed

答えて

0

ユーザノードの1つ(またはいくつか)のように、文字列型のアドレスフィールドがあります。試しにそれを囲み、ノードの例外とキーの両方を記録して、犯人を見つけてください。

usersRef.addChildEventListener(new ChildEventListener() { 

     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

      try{ 
       User user = dataSnapshot.getValue(User.class); 
      } 
      catch(DatabaseException e){ 
       //Log the exception and the key 
       dataSnapshot.getKey(); 
      } 
     } 

      ... 

} 
+0

はい、それです!何らかの理由で、古いノードにアドレスとしての文字列があります。/ ありがとうございます! –

1

を知らないエラーがAddressクラスのインスタンスにuserノードの一つ下address値をマーシャリングしようとしているFirebaseに関する。

データベースのaddressの値は、クラスAddressと一致する必要がありますが、そのうちの1つはAddressインスタンスに変換できない文字列です。

address値が文字列であることになっている場合、あなたはStringUserクラスのaddressフィールドの種類を変更する必要があります:

private String address; 

そうでない場合、あなたはそれぞれをチェックする必要がありますあなたのデータベースにあるuserのノードには、間違ってaddress値の文字列があります。

関連する問題