首页 > 解决方案 > 当我想 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 数据

在此处输入图像描述

标签: javaandroidfirebasefirebase-realtime-databasetoken

解决方案


您收到以下错误:

无法将 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..."

如果您按上述方式更改架构,则在代码中您无需执行任何操作。它应该按预期工作。


推荐阅读