Модифицировать пост с использованием Firebase
Пожалуйста, любой, пожалуйста, помогите. Это мой метод 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
пожалуйста помоги................
3 ответа
В 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"}}}
поэтому будущие пользователи могут быть добавлены до тех пор, пока их не зовут Сэм.
Я не думаю, что вы должны использовать Retrofit
размещать данные.
Существует способ сохранения данных в Firebase. Можете ли вы знать, что Firebase сам управляет всем этим в фоновом режиме.
Я не знаю, почему вы публикуете данные с помощью Retrofit.
Фрагмент для отправки и обновления автоматически.
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("год рождения") SetValue(1912).
Это сохранит, как вы хотите:
{
"users": {
"alanisawesome": {
"birthYear": "1912",
"fullName": "Alan Turing"
}
}
}
Пожалуйста, следуйте документации: Сохранение данных в Firebase
Спасибо.
Как сказал @sushildlh, в этом случае не стоит использовать модификацию (если мы думаем о таймерах отправки / ответа на запрос), но это хорошая практика программирования для Android. И я уверен, что вы все равно должны использовать модернизацию.
Но это не главное. Ваша проблема в вашем API на firebase. Создайте свой собственный файл JSON с ответом, который вы хотите получить, и загрузите его на базу данных.
ура