使用Firebase重新发布帖子

sus*_*dlh 10 java android firebase retrofit2

请任何人请帮忙.这是我的API方法

@POST("/user/new.json")
Call createUser(@Body User user);
Run Code Online (Sandbox Code Playgroud)

这是我的电话 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");
        }
    });
Run Code Online (Sandbox Code Playgroud)

这是 User.java

public class User {

        int id;

        String name;

        public User(int id, String name) {
            this.id = id;
            this.name = name;
        }
    }
Run Code Online (Sandbox Code Playgroud)

输出就是这样的: -

"user" : {"new" : {"-KBgcQTomo8xGpnv5raM" : {"id" : 1,"name" : "Sam"}}}
Run Code Online (Sandbox Code Playgroud)

但我想要这样的输出: -

"user" : {"new" : {"id" : 1,"name" : "Sam"}}
Run Code Online (Sandbox Code Playgroud)

这是Retrofit + Firebase教程

请帮忙................

los*_*der 9

在firebase中,当您发布POST时,您试图推送到POST的URL下存储的数据列表.因此,无法POST到/user/new.json,也不能将数据存储在/ user/new下新的firebase生成的密钥(如"-KBgcQTomo8xGpnv5raM")下.

如果要完全控制放置数据的位置,则必须使用PUT.但是,将您的新条目直接设置为/ user/new是没有意义的.后续条目将在哪里?

如果您不接受服务器端密钥分配,那么通常的解决方案是使用您将强制执行唯一性的条目的某些部分.例如,名称或数字ID可以是新用户的密钥,以便可以添加多个用户.

基于改造API并使用name作为唯一键,这:

@POST("/user/new.json")
Call createUser(@Body User user);
Run Code Online (Sandbox Code Playgroud)

会成为:

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

和:

Call<User> call=api.createUser(user);
Run Code Online (Sandbox Code Playgroud)

然后是:

Call<User> call=api.createUser(user.name, user);
Run Code Online (Sandbox Code Playgroud)

现在的布局是:

"user" : {"new" : {"Sam": {"id" : 1,"name" : "Sam"}}}
Run Code Online (Sandbox Code Playgroud)

因此,只要他们没有被命名为Sam,就可以添加未来的用户.


Pra*_*ani 7

我不认为你必须使用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);
Run Code Online (Sandbox Code Playgroud)

您还可以将数据直接保存到数据库位置:

//在父节点alansRef.child("fullName")上使用.child()引用子节点.setValue("Alan Turing"); alansRef.child( "birthYear")的setValue(1912).

它会保存你想要的:

{
  "users": {
    "alanisawesome": {
      "birthYear": "1912",
      "fullName": "Alan Turing"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

请按照文档:在Firebase中保存数据

谢谢.

  • **1)**答案应将Firebase + Retrofit案例的解决方案作为OP请求,而不是建议使用Firebase SDK.**2)**优良的做法是实现可以在将来更改的REST API,而不是使用专有的SDK,您需要坚持直到完全重写... (2认同)

小智 3

正如 @sushildlh 所说,在这种情况下并不值得使用改造(如果我们正在考虑请求发送/响应计时器),但这是很好的 Android 编程实践。我确信您仍然应该使用改造。

但这不是重点。您的问题出在 firebase 上的 API 中。使用您想要获取的响应创建您自己的 json 文件并将其上传到 firebase。

干杯