java - 当我想 FCM 发送通知时,无法将 java.lang.String 类型的对象转换为类型
问题描述
java.lang.String
当我想 FCM 发送通知时,无法将类型对象转换为类型。
在我的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 数据
解决方案
您收到以下错误:
无法将 java.lang.String 类型的对象转换为 TokenModel 类型
因为当您使用以下参考时:
DatabaseReference tokens = FirebaseDatabase.getInstance().getReference("Tokens");
并且您使用对方法的调用遍历结果.getChildren()
,这意味着您想要获取该引用下存在的所有子项。使用以下代码行时:
TokenModel tokenModel = snapshot.getValue(TokenModel.class);
这意味着您正在尝试将每个孩子转换为 type 的对象TokenModel
,这是不可能的,因为每个孩子都是 String 而不是TokenModel,因此会出现错误。
要解决这个问题,您应该在“令牌”节点下存储令牌对象。所以你的架构应该是这样的:
Firebase-root
|
--- Tokens
|
--- $tokenId
| |
| --- token: "f5VI ... 2zjR..."
|
--- $tokenId
|
--- token: "c8H7 ... 9pMC..."
如果您按上述方式更改架构,则在代码中您无需执行任何操作。它应该按预期工作。