2016-03-01 2 views
11

いずれかお手伝いください。これは、これはこれはUser.javaFirebaseを使用した後付けのポスト

public class User { 

     int id; 

     String name; 

     public User(int id, String name) { 
      this.id = id; 
      this.name = name; 
     } 
    } 

出力がそのように来ているMainActivity

Retrofit retrofit=new Retrofit.Builder().baseUrl("https://XXXXXX.firebaseio.com").addConverterFactory(GsonConverterFactory.create()).build(); 

    Api api=retrofit.create(Api.class); 

    User user=new User(1,"Sam"); 

    Call<User> call=api.createUser(user); 
    call.enqueue(new Callback<User>() { 
     @Override 
     public void onResponse(Call<User> call, Response<User> response) { 
      Log.d("sam","run"); 
     } 

     @Override 
     public void onFailure(Call<User> call, Throwable t) { 
      Log.d("sam","error"); 
     } 
    }); 

で私の呼び出しである私のAPIメソッド

@POST("/user/new.json") 
Call createUser(@Body User user); 

です: -

"user" : {"new" : {"-KBgcQTomo8xGpnv5raM" : {"id" : 1,"name" : "Sam"}}} 

しかし、私はそのような出力たい: -

+0

APIを変更してください。どんなAPIが送られてもそれは受け取ります。また、JSONのどれも有効に見えません。 (@ user)] – Rohit5k2

+0

@Rohitは私がどのように変化するかを助けることができます..... – sushildlh

+0

公開インタフェースApi { @POST( "/ user/new.json") createUser(@Body User user); }最後に – sushildlh

答えて

3

................助けてください

"user" : {"new" : {"id" : 1,"name" : "Sam"}} 

ここではRetrofit + Firebase

ためのチュートリアルです@sushildlhとして、この場合には改造を使用する価値はないと言っています(リクエストの送信/応答タイマーについて考えているのであれば)、それは良いアンドロイドのプログラミングの練習です。そして、私はあなたがまだ改装を使用するべきだと確信しています。

しかし、それは重要ではありません。あなたの問題はあなたのAPIのfirebaseにあります。 firebaseで取得してアップロードしたいと思う応答で、あなた自身のjsonファイルを作成してください。

乾杯

6

私はあなたがデータを投稿するRetrofitを使用する必要はないと思います。

FirebaseにはWay to Savingのデータがあります。 Firebaseがすべてのことをバックグラウンドで管理していることをご存じですか?

私はなぜデータを投稿しているのか分かりません改装しました。

スニペットが自動的に送信および更新されます。

public class User { 
    private int birthYear; 
    private String fullName; 

    public User() {} 

    public User(String fullName, int birthYear) { 
     this.fullName = fullName; 
     this.birthYear = birthYear; 
    } 

    public long getBirthYear() { 
     return birthYear; 
    } 

    public String getFullName() { 
     return fullName; 
    } 
} 

Firebase alanRef = ref.child("users").child("alanisawesome"); 

User alan = new User("Alan Turing", 1912); 

alanRef.setValue(alan); 

また、データベースの場所にデータを直接保存することができます:.childを使用して、子ノードを参照

//()それは、親ノードの alansRef.child( "のfullName" に).setValue( "Alan Turing");alansRef.child( "birthYear")。setValue(1912);

あなたが望むように、それは保存されます:

{ 
    "users": { 
    "alanisawesome": { 
     "birthYear": "1912", 
     "fullName": "Alan Turing" 
    } 
    } 
} 

をドキュメントに従ってください:Saving Data in Firebase

ありがとうございました。

+0

私は改造のbcozの応答時間を使用してfirebaseと比較して良いです....とにかく応答のためのthanx – sushildlh

+1

どのように言うことができますか?あなたはどこでも比較したことがありますか? –

+0

私は最初のファイヤーベースのドキュメントコードを使用した後、改造に切り替えました.............. – sushildlh

8

firebaseの場合、POSTの場合、POSTのURLの下に格納されているlist of dataにプッシュしようとしています。その結果、/ user/new.jsonにPOSTすることはできず、/ user/newの下に "-KBgcQTomo8xGpnv5raM"のような新しいfirebase生成キーの下にデータを格納することはできません。

データを格納する場所を完全に制御したい場合は、PUTを使用する必要があります。しかし、新しいエントリを/ user/newとして直接入れるのは意味がありません。それ以降のエントリはどこに行きますか?

サーバーサイドキーの割り当てを受け入れていない場合は、一意性を強制するエントリの一部を使用するのが通常の解決方法です。たとえば、複数のユーザーを追加できるように、名前または数値のいずれかを新しいユーザーのキーにすることができます。

改造APIに基づいており、一意のキーとして名前を使用して、この:

@POST("/user/new.json") 
Call createUser(@Body User user); 

はなる:

@PUT("/user/new/{name}.json") 
Call createUser(@Path("name") String name, @Body User user); 

と:

Call<User> call=api.createUser(user); 

は次のようになります。

Call<User> call=api.createUser(user.name, user); 

今のレイアウトは次のようになります。

"user" : {"new" : {"Sam": {"id" : 1,"name" : "Sam"}}} 

ので、将来のユーザーがいる限り、彼らは、サムと命名されていないとして追加することができます。

+1

'@Path(" name ")String name'は' -KBgcQTomo8xGpnv5raM'です。匿名で指定された名前を識別することは非常に困難です。私はPUT、DELETE、GETで行っていますが、私はPOSTにしか問題ありません。 – sushildlh

+0

@sushildlh、POSTを使用する場合は、作成したものはこの種のランダム性を持つパスに新しいリーフを取得します。 PUTを使用する場合は、URL内のパス全体を制御しますが、複数のものをサポートしたい場合は、改造時にパス操作を使用する必要があります。 – lossleader

+0

あなたの応答のための余裕.....私はあなたの努力のためにポスト..... +1を探しています – sushildlh

関連する問題