当我想 FCM 发送通知时,无法将 java.lang.String 类型的对象转换为类型
Can't convert object of type java.lang.String to type, when I want to FCM send notifitcation
当我想要 FCM 发送通知时,无法将 java.lang.String
类型的对象转换为类型。
在我的TokenModel
public class TokenModel {
private String token;
public TokenModel(String token) {
this.token = token;
}
public TokenModel() {}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
}
和SendNotification.java
private void sendNotification(String receiver, String username, String msg) {
DatabaseReference tokens = FirebaseDatabase.getInstance().getReference("Tokens");
Query query = tokens.orderByKey().equalTo(receiver);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
TokenModel tokenModel = snapshot.getValue(TokenModel.class);
MessageTokenDataModel data = new MessageTokenDataModel(firebaseUser.getUid(), R.mipmap.ic_launcher, username + ": " + msg, "New Message", userid);
Sender sender1 = new Sender(data, tokenModel.getToken());
apiService.sendNotification(sender1)
.enqueue(new Callback<MyResponse>() {
@Override
public void onResponse(Call<MyResponse> call, Response<MyResponse> response) {
if (response.code() == 200) {
if (response.body().success != 1) {
Toast.makeText(NewChatActivity.this, "Failed", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onFailure(Call<MyResponse> call, Throwable t) {
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
但是在这一行中,我会得到错误:
TokenModel tokenModel = snapshot.getValue(TokenModel.class);
下面的数据是我的firebase数据
您收到以下错误:
Can't convert an object of type java.lang.String to type TokenModel
因为当您使用以下参考时:
DatabaseReference tokens = FirebaseDatabase.getInstance().getReference("Tokens");
并且您使用对 .getChildren()
方法的调用来遍历结果,这意味着您想要获取该引用下存在的所有子项。使用以下代码行时:
TokenModel tokenModel = snapshot.getValue(TokenModel.class);
这意味着您正在尝试将每个子对象转换为 TokenModel
类型的对象,这是不可能的,因为每个子对象都是字符串,不是 TokenModel ,因此出现该错误。
要解决这个问题,您应该在“令牌”节点下存储令牌对象。所以你的模式应该是这样的:
Firebase-root
|
--- Tokens
|
--- $tokenId
| |
| --- token: "f5VI ... 2zjR..."
|
--- $tokenId
|
--- token: "c8H7 ... 9pMC..."
如果您按上述方式更改架构,则在代码中您无需执行任何操作。它应该按预期工作。
当我想要 FCM 发送通知时,无法将 java.lang.String
类型的对象转换为类型。
在我的TokenModel
public class TokenModel {
private String token;
public TokenModel(String token) {
this.token = token;
}
public TokenModel() {}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
}
和SendNotification.java
private void sendNotification(String receiver, String username, String msg) {
DatabaseReference tokens = FirebaseDatabase.getInstance().getReference("Tokens");
Query query = tokens.orderByKey().equalTo(receiver);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
TokenModel tokenModel = snapshot.getValue(TokenModel.class);
MessageTokenDataModel data = new MessageTokenDataModel(firebaseUser.getUid(), R.mipmap.ic_launcher, username + ": " + msg, "New Message", userid);
Sender sender1 = new Sender(data, tokenModel.getToken());
apiService.sendNotification(sender1)
.enqueue(new Callback<MyResponse>() {
@Override
public void onResponse(Call<MyResponse> call, Response<MyResponse> response) {
if (response.code() == 200) {
if (response.body().success != 1) {
Toast.makeText(NewChatActivity.this, "Failed", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onFailure(Call<MyResponse> call, Throwable t) {
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
但是在这一行中,我会得到错误:
TokenModel tokenModel = snapshot.getValue(TokenModel.class);
下面的数据是我的firebase数据
您收到以下错误:
Can't convert an object of type java.lang.String to type TokenModel
因为当您使用以下参考时:
DatabaseReference tokens = FirebaseDatabase.getInstance().getReference("Tokens");
并且您使用对 .getChildren()
方法的调用来遍历结果,这意味着您想要获取该引用下存在的所有子项。使用以下代码行时:
TokenModel tokenModel = snapshot.getValue(TokenModel.class);
这意味着您正在尝试将每个子对象转换为 TokenModel
类型的对象,这是不可能的,因为每个子对象都是字符串,不是 TokenModel ,因此出现该错误。
要解决这个问题,您应该在“令牌”节点下存储令牌对象。所以你的模式应该是这样的:
Firebase-root
|
--- Tokens
|
--- $tokenId
| |
| --- token: "f5VI ... 2zjR..."
|
--- $tokenId
|
--- token: "c8H7 ... 9pMC..."
如果您按上述方式更改架构,则在代码中您无需执行任何操作。它应该按预期工作。