Модифицировать пост с помощью Firebase
Пожалуйста, помогите пожалуйста. Это метод My API
@POST("/user/new.json")
Call createUser(@Body User user);
Это мой вызов в 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");
}
});
Это User.java
public class User {
int id;
String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
}
Выход идет следующим образом: -
"user" : {"new" : {"-KBgcQTomo8xGpnv5raM" : {"id" : 1,"name" : "Sam"}}}
Но я хочу, чтобы результат был следующим: -
"user" : {"new" : {"id" : 1,"name" : "Sam"}}
Вот учебник для "Дооснащение + Firebase"
пожалуйста, помогите................
Ответы
Ответ 1
В firebase, когда вы POST, вы пытаетесь нажать на список данных, сохраненный под URL-адресом POST. Следовательно, невозможно POST для /user/new.json и не хранить данные под новым сгенерированным firebase ключом, например "-KBgcQTomo8xGpnv5raM" ниже /user/new.
Если вы хотите полностью контролировать, куда вы помещаете данные, вы должны использовать 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"}}}
поэтому будущие пользователи могут быть добавлены до тех пор, пока они не будут называться Sam.
Ответ 2
Я не думаю, что вам нужно использовать Retrofit
для публикации данных.
В Firebase есть Способ сохранения данных. Знаете ли вы, что 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);
Вы также можете сохранить данные непосредственно в местоположении базы данных:
//Ссылка на дочерний элемент node с помощью .child() на нем родительский nodealansRef.child( "fullName" ). setValue ( "Алан Тьюринг" ); alansRef.child( "год рождения" ) SetValue (1912);.
Он сохранит, как вы хотите:
{
"users": {
"alanisawesome": {
"birthYear": "1912",
"fullName": "Alan Turing"
}
}
}
Пожалуйста, следуйте документам: Сохранение данных в Firebase
Спасибо.
Ответ 3
Как @sushildlh сказал, что в этом случае не стоит использовать модификацию (если мы думаем о запросах отправки/ответа таймеров), но это хорошая практика программирования в Android. И я уверен, что вы все равно должны использовать модификацию.
Но это не главное. Ваша проблема в вашем API на firebase. Создайте свой собственный json файл с ответом, который вы хотите получить, и загрузите его на firebase.
Приветствия