请任何人请帮忙。这是我的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/
的教程请帮助................
答案 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上。
干杯