2016-08-02 8 views
0
私はFirebaseデータベースにオブジェクトを書き込むしようとすると、

こんにちは - 私は、このエラーを取得中にエラーが以下の通りです:FirebaseデータベースにInvocationTargetException

`

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
                      at com.google.android.gms.internal.zzaix$zza.zzaE(Unknown Source) 
                      at com.google.android.gms.internal.zzaix.zzaw(Unknown Source) 
                      at com.google.android.gms.internal.zzaix.zzav(Unknown Source) 
                      at com.google.firebase.database.DatabaseReference.zza(Unknown Source) 
                      at com.google.firebase.database.DatabaseReference.setValue(Unknown Source) 

私が追加しようとしたときにエラーが開始Udacityから、実施例により案内FirebaseからServerValue.TIMESTAMP、here's私のPOJO:

public class Messages { 

    private String content, author, authorPhoto; 
    private int type; 
    protected HashMap<String, Object> timeStampCreated; 
    private Uri uri; 


    public Messages() {//Empty default constructor, necessary for FireBase to be able to deserialize blog posts 
    } 

    public void setContent(String content) { 
     this.content = content; 
    } 

    public String getContent() { 
     return content; 
    } 

    public String getAuthor() { 
     return author; 
    } 

    public String getAuthorPhoto() { 
     return authorPhoto; 
    } 

    public int getType() { 
     return type; 
    } 

    @JsonIgnore 
    public long getTimeStamp() { 
     return (long)timeStampCreated.get("timeStamp"); 
    } 

    public void setTimeStamp() { 
     HashMap<String, Object> hmDate = new HashMap<>(); 
     hmDate.put("timeStamp", ServerValue.TIMESTAMP); 
     this.timeStampCreated = hmDate; 
    } 

    public void setAuthor(String author) { 
     this.author = author; 
    } 

    public void setAuthorPhoto(String authorPhoto) { 
     this.authorPhoto = authorPhoto; 
    } 

    public void setType(int type) { 
     this.type = type; 
    } 

    public Uri getUri() { 
     return uri; 
    } 

    public void setUri(Uri uri) { 
     this.uri = uri; 
    } 
} 

と - 私はこのメッセージを追加しようとFirebase Dに反対の方法をhere's値を設定すると、正確なエラーが表示されます。

public void sendMessage(String content, final int type) { 
     Messages message = new Messages(); 
     message.setContent(content); 
     message.setTimeStamp(); 
     message.setAuthor(email); 
     message.setAuthorPhoto(picURL); 
     message.setType(type); 

     FBRefMessages.push().setValue(message, new DatabaseReference.CompletionListener() { 
      @Override 
      public void onComplete(DatabaseError error, DatabaseReference databaseReference) { 
       if (error == null) { 
        Log.d("Adapter", "onChildAdded: The adapter is: " + mAdapter); 
        updateNodes(); 
       } else {//There was an error 
       } 
      } 
     }); 
    } 

助けてください!

答えて

1

ウリはサポートされているデータ型ではない、https://www.firebase.com/docs/android/guide/understanding-data.html

がStringと交換してみ参照してください。

+0

FBRefMessages.push()。setValue(message、new DatabaseReference.CompletionListener())理由はわかりませんが、参照がこの値に設定されていますが、この行にブレークポイントを追加しました。 :そのようなインスタンスフィールドはありません: 'FBRefMessages' – Andrea

+0

'JsonIgnore'で' getTimeStamp'を削除しようとしましたが、動作しましたが、 'ServerValue.TIMESTAMP'を追加する必要があります。どうすれば追加できますか? – Andrea

0

これをしばらく試してみたところ、ServerValue.TIMESTAMPをPOJOに使用することはできません。

ご存知のように、ServerValue.TIMESTAMPMap<String,String>です。非POJOユースケースでは、setValue()Objectの引数として、setValue()にはMap<String,Object>の要素として与えることができます。データストア要求を処理するとき、Firebaseサーバは特別なマーカー値を認識し、それをサーバ時間に置き換えます。その後、データが読み取られると、Longとして返されます。

シリアル化のPOJO処理は、固定タイプのフィールドに基づいています。アウトプットではMap<String,String>、入力時にはLongである必要があるフィールドでは、どのように動作させることができないのか分かりません。

精度の低いタイムスタンプを許容できる場合は、リスナーを追加してクロックのスキューを監視し、独自のタイムスタンプを派生させることを検討してください。これはdocumentationに記載されています。

+0

'ServerValue.TIMESTAMP'を使用するのに役立つ回避策? – Andrea

+0

私はあなたよりも賢い人から別の答えを得るかもしれません。あなたが望むようにPOJOで使う方法はありません。あなたの 'Messages' POJOの外に別の値として作成時間を保存してください。setValue()の呼び出しが一緒に行われた場合、タイムスタンプは1秒以内に正確でなければなりません。 –

関連する問題