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)
请帮忙................
在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,就可以添加未来的用户.
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中保存数据
谢谢.
小智 3
正如 @sushildlh 所说,在这种情况下并不值得使用改造(如果我们正在考虑请求发送/响应计时器),但这是很好的 Android 编程实践。我确信您仍然应该使用改造。
但这不是重点。您的问题出在 firebase 上的 API 中。使用您想要获取的响应创建您自己的 json 文件并将其上传到 firebase。
干杯
| 归档时间: |
|
| 查看次数: |
6922 次 |
| 最近记录: |