Модифицировать пост с помощью 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.

Приветствия