使用Firebase重新发布帖子

时间:2016-03-01 12:13:55

标签: java android firebase retrofit2

请任何人请帮忙。这是我的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"}}

这是http://jsfiddle.net/kpsingh/LXAt7/503/

的教程

请帮助................

3 个答案:

答案 0 :(得分:8)

在firebase中,当您POST尝试推送到POST的URL下存储的list of data时。因此,无法POST到/user/new.json,也不能将数据存储在/ user / new下新的firebase生成的密钥(如“-KBgcQTomo8xGpnv5raM”)下。

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

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

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

@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。

答案 1 :(得分:6)

我认为您不必使用Retrofit发布数据。

Firebase中有Way to Saving个数据。您是否知道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( “birthYear”)的setValue(1912);

它将按您的意愿保存:

{
  "users": {
    "alanisawesome": {
      "birthYear": "1912",
      "fullName": "Alan Turing"
    }
  }
}

请按照文档:Saving Data in Firebase

谢谢。

答案 2 :(得分:3)

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

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

干杯