【问题标题】:Display data from user uid with Firebase Database使用 Firebase 数据库显示来自用户 uid 的数据
【发布时间】:2022-01-09 16:42:53
【问题描述】:

我想从 uid 中恢复数据,然后在 RecyclerView 中显示。

感谢 uid,我设法在 Withdrawal 下恢复了孩子/父母。

这就是它在 Java 中的样子:

referenceWithdraw = FirebaseDatabase.getInstance().getReference().child("Withdraw");
Query queryUid = referenceWithdraw.orderByChild("uid").equalTo(user.getUid());
    queryUid.get().addOnCompleteListener(task -> {
        if (task.isSuccessful()) {
            for (DataSnapshot dataSnapshot : task.getResult().getChildren()) {
                String id = dataSnapshot.child("id").getValue(String.class)

                    }
                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {

                    }
                });

            }
        } else {
            ///
        }
   });

String id = ... 检索子值。

到目前为止一切都很好,除非我在 String id = ...

referenceWithdraw.child(id).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        WithdrawProfile profile = snapshot.getValue(WithdrawProfile.class);
        list.add(profile);
        adapter.notifyDataSetChanged();
    }

我的 Logcat 中出现了这个错误:

com.google.firebase.database.DatabaseException: Failed to convert a value of type java.lang.String to int
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertInteger(CustomClassMapper.java:364)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToPrimitive(CustomClassMapper.java:290)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:215)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToType(CustomClassMapper.java:179)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.access$100(CustomClassMapper.java:48)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:593)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:563)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:433)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80)
    at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203)
    at com.pckage.app.android.withdraw.Withdraw$1.onDataChange(Withdraw.java:62)
    at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
    at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
    at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:264)
    at android.app.ActivityThread.main(ActivityThread.java:8306)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049)

最后是我的 WithdrawProfile :

public class WithdrawProfile {
    private String date, email, status, id;
    private int prize;
    public WithdrawProfile(){}

    public WithdrawProfile(String date, String email, String status, String id, int prize) {
        this.date = date;
        this.email = email;
        this.status = status;
        this.id = id;
        this.prize = prize;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public int getPrize() {
        return prize;
    }

    public void setPrize(int prize) {
        this.prize = prize;
    }
}

我的数据库:

{
  "Daily" : {
    "KuTKHdv1qeYS1NeQVZlqYdZYyNi1" : {
      "date" : "07/01/2022"
    }
  },
  "Users" : {
    "KuTKHdv1qeYS1NeQVZlqYdZYyNi1" : {
      //Other value
      "uid" : "KuTKHdv1qeYS1NeQVZlqYdZYyNi1"
    }
  },
  "Withdraw" : {
    "-MszSsu9rn6XzRMUNgTc" : {
      "date" : "09/01/2022",
      "id" : "-MszSsu9rn6XzRMUNgTc",
      "email" : "test@gmail.com",
      "prize" : "1000",
      "statut" : "Pending",
      "uid" : "KuTKHdv1qeYS1NeQVZlqYdZYyNi1"
    }
  }
}

感谢您的宝贵时间

【问题讨论】:

  • 请编辑您的问题以显示:1) 错误消息的完整堆栈跟踪,2) 发生异常时您正在阅读的 JSON(作为文本,请不要截图)。您可以通过单击Firebase Database console 上溢出菜单 (⠇) 中的“导出 JSON”链接来获取此信息。
  • 完成了,先生!

标签: java firebase firebase-realtime-database


【解决方案1】:

问题在于从数据库中读取这个值:

"prize" : "1000",

在您的 Java 类中,您将 prize 定义为 int:

public int getPrize() {
    return prize;
}

public void setPrize(int prize) {
    this.prize = prize;
}

但在您的数据库中,它存储为字符串值:"1000"。由于它们不是同一类型,因此 Firebase 无法读取 prize 值并引发错误。

解决方案是将奖品存储为一个(整数)数字:

"prize" : 1000,

或者在你的 Java 代码中也让它成为一个字符串:

private String prize;

...

public String getPrize() {
    return prize;
}

public void setPrize(String prize) {
    this.prize = prize;
}

【讨论】:

  • 哦,我刚刚编辑过,效果很好。原谅我这个粗心的错误。非常感谢!!
  • 多亏了额外的信息,我才能够找到问题所在,所以所有?
猜你喜欢
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
相关资源
最近更新 更多