2016-03-01 23 views
11

Please any any please help. Questo è il mio metodo APIPost di aggiornamento utilizzando Firebase

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

Questa è la mia chiamata nella 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"); 
     } 
    }); 

Questo è User.java

public class User { 

     int id; 

     String name; 

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

uscita è venuta così: -

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

ma voglio uscita così: -

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

Ecco Tutorial per Retrofit + Firebase

si prega di aiutare ................

+0

Modifica la tua API. Qualunque sia l'API che ricevi ricevi. Inoltre, nessuno dei JSON sembra valido. Manca '}' – Rohit5k2

+0

@Rohit puoi aiutarmi come cambio ..... – sushildlh

+0

interfaccia pubblica Api { @POST ("/ user/new.json") Chiama createUser (utente utente @Body); } – sushildlh

risposta

3

Come @sushildlh ha detto che in questo caso non vale la pena utilizzare il retrofit (se stiamo pensando ai timer di invio/risposta delle richieste), ma è una buona pratica di programmazione per Android. E sono sicuro che dovresti ancora usare il retrofit.

Ma non è questo il punto. Il tuo problema è nella tua API su firebase. Crea il tuo file JSON con la risposta che vuoi ottenere e caricarlo su Firebase.

Acclamazioni

6

io non penso che si debba usare Retrofit per inviare i dati.

Ci sono dati Way to Saving in Firebase. Potresti sapere che Firebase gestisce tutto il materiale in background.

Non so perché stai postando i dati utilizzando la modifica .

Snippet da inviare e aggiornare automaticamente.

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

È inoltre possibile salvare i dati direttamente a un percorso del database:

// 'un riferimento al nodo figlio utilizzando un .child() su di esso del nodo principale alansRef.child ("fullName") .setValue ("Alan Turing"); alansRef.child ("birthYear"). SetValue (1912);

Ti farà risparmiare come si vuole:

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

si prega di seguire la documentazione: Saving Data in Firebase

Grazie.

+0

io uso retrofit tempo di risposta bcoz di retrofit è buono confrontare firebase .... comunque grazie per la risposta – sushildlh

+1

Come si può dire? Hai confrontato o semplicemente letto ovunque? –

+0

ho usato i primi codici di Firebase dopo che ho cambiato il retrofit .............. – sushildlh

8

In Firebase, quando si POST si sta tentando di passare a un list of data memorizzato sotto l'URL del POST. Di conseguenza, non è possibile inviare POST a /user/new.json e non memorizzare i dati con una nuova chiave generata da Firebase come "-KBgcQTomo8xGpnv5raM" sotto/utente/nuovo.

Se si desidera il controllo completo di dove si stanno inserendo i dati, è necessario utilizzare PUT. Tuttavia, inserire la nuova voce direttamente come/utente/nuovo non avrebbe senso. Dove andranno le voci successive?

Se non si accettano le assegnazioni dei tasti laterali del server, la soluzione normale consiste nell'utilizzare una parte della voce su cui verrà applicata l'unicità. Ad esempio, il nome o l'id numerico potrebbe essere la chiave per il nuovo utente in modo che possano essere aggiunti più utenti.

Sulla base della API retrofit e utilizzando il nome come chiave unica, questo:

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

diventerebbe:

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

e:

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

sarebbe allora:

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

ora il layout sarebbe:

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

utenti in modo futuri potrebbero essere aggiunti fino a quando non sono stati nominati Sam.

+1

Come si ottiene questo nome nel '@Path (" name ") String name' è' -KBgcQTomo8xGpnv5raM'. È molto difficile identificare quello chiamato in modo anonimo. Ho fatto con PUT, DELETE, GET ma ho solo problemi con POST. – sushildlh

+0

@sushildlh, Se usi POST, qualsiasi cosa tu crei otterrà una nuova foglia nel percorso con questo tipo di casualità. Se usi PUT, controlli l'intero percorso nell'URL che hai inserito, ma poi devi usare la manipolazione del percorso in retrofit se vuoi supportare più di uno di qualcosa. – lossleader

+0

Grazie per la tua risposta ..... Sto cercando post ..... +1 per il tuo sforzo – sushildlh

Problemi correlati