Модернизируйте сообщение с помощью 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

пожалуйста помоги................


person sushildlh    schedule 01.03.2016    source источник
comment
Пожалуйста, измените ваш API. Независимо от того, что API отправляет, вы получаете. Кроме того, ни один из JSON не выглядит действительным. Отсутствует }   -  person Rohit5k2    schedule 01.03.2016
comment
@Rohit, ты можешь помочь мне, как мне измениться .....   -  person sushildlh    schedule 01.03.2016
comment
открытый интерфейс Api { @POST(/user/new.json) Call‹User› createUser(@Body User user); }   -  person sushildlh    schedule 01.03.2016
comment
в конце }} я забыл..   -  person sushildlh    schedule 01.03.2016
comment
Вы имеете в виду, что этот JSON является вашими почтовыми данными? Я думал, это то, что возвращает ваш API.   -  person Rohit5k2    schedule 01.03.2016
comment
пользователь: {новый: {-KBgcQTomo8xGpnv5raM: {id: 1, имя: Сэм}   -  person sushildlh    schedule 01.03.2016
comment
почтовые данные возвращают это   -  person sushildlh    schedule 01.03.2016
comment
но я не отправляю это имя -KBgcQTomo8xGpnv5raM   -  person sushildlh    schedule 01.03.2016
comment
Это JSON, который вы отправляете или получаете в onResponse?   -  person Rohit5k2    schedule 01.03.2016
comment
я отправляю только этот JSON через почтовый метод {id: 1, name: Sam}   -  person sushildlh    schedule 01.03.2016
comment
Вы хотите отправить это, но отправляется другой json, верно? Если да, напишите User.java   -  person Rohit5k2    schedule 01.03.2016
comment
не могли бы вы объяснить вкратце. я не понял твою мысль.   -  person sushildlh    schedule 01.03.2016
comment
Поскольку вы используете firebase, лучше использовать их библиотеку Android, а не использовать Retrofit. Узнайте больше здесь: firebase.com/docs/android/guide   -  person Much Overflow    schedule 01.03.2016
comment
Время отклика firebase медленное по сравнению с модернизацией.   -  person sushildlh    schedule 01.03.2016
comment
Есть ли необходимость использовать Firebase с Retrofit, поскольку мы знаем, что Firebase выполняет все операции в фоновом режиме. Я опубликовал свой ответ. Пусть это поможет вам.   -  person Pratik Butani    schedule 13.05.2016
comment
Если вы действительно хотите, чтобы пользователь был новым, я думаю, вам просто нужно изменить POST на PUT. . Я ответил, как я обычно это делаю, так как не понимаю, почему вы хотите поддерживать только одного нового пользователя?   -  person lossleader    schedule 15.05.2016


Ответы (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"}}}

так что будущих пользователей можно было добавить, если они не были названы Сэмом.

person lossleader    schedule 15.05.2016
comment
Как вы получаете это имя в @Path("name") String name это -KBgcQTomo8xGpnv5raM .Очень трудно идентифицировать это анонимное имя. Я сделал с PUT, DELETE, GET, но у меня проблема только с POST. - person sushildlh; 15.05.2016
comment
@sushildlh, если вы используете POST, все, что вы создаете, получит новый лист на пути с такой случайностью. Если вы используете PUT, вы контролируете весь путь в URL-адресе, на который вы указываете, но тогда вам нужно использовать манипулирование путями в модификации, если вы хотите поддерживать более одного чего-то. - person lossleader; 15.05.2016
comment
@sushildlh, если вы хотите избежать случайных идентификаторов ключей, вы пытаетесь PUT. Весь смысл публикации в том, что она генерирует их, чтобы вы могли отправлять сообщения родителю и получать новый неконфликтующий потомок столько раз, сколько захотите. Вы можете создавать свои собственные пути/ключи точно так, как вы хотите, с помощью put или принимать случайные идентификаторы с помощью post.. - person lossleader; 15.05.2016

Я не думаю, что вам нужно использовать 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

Спасибо.

person Pratik Butani    schedule 13.05.2016
comment
я использую модификацию bcoz, время отклика модификации хорошее по сравнению с firebase .... в любом случае, спасибо за ответ - person sushildlh; 13.05.2016
comment
Дорогой, я не думаю, как вы будете использовать Retrofit с Firebase. - person Pratik Butani; 13.05.2016
comment
Добро пожаловать, и если вы можете сделать это каким-либо образом, пожалуйста, дайте мне знать. Как я хочу научиться. Так держать. Продолжайте #RetroFiring. :) - person Pratik Butani; 13.05.2016
comment
1) Ответ должен содержать решение для случая Firebase + Retrofit в соответствии с запросом OP вместо предложения использования Firebase SDK. 2) Хорошей практикой является внедрение REST API, который может быть изменен в будущем, вместо использования проприетарного SDK, с которым вам нужно работать до полной перезаписи... - person Rafal Zawadzki; 19.05.2016

Как сказал @sushildlh, в этом случае не стоит использовать модернизацию (если мы думаем о таймерах отправки/ответа запросов), но это хорошая практика программирования для Android. И я уверен, что вы все равно должны использовать ретрофит.

Но это не главное. Ваша проблема в вашем API на firebase. Создайте свой собственный json-файл с ответом, который вы хотите получить, и загрузите его на базу данных firebase.

Ваше здоровье

person Piotr Mądry    schedule 13.05.2016