【问题标题】:Retrieve data under user id from Firebase从 Firebase 检索用户 ID 下的数据
【发布时间】:2021-08-09 14:27:47
【问题描述】:

我正在尝试检索所有 userId 下的数据。我尝试了here 中的建议,请参阅下面的代码:

final DatabaseReference ratingRef = FirebaseDatabase.getInstance().getReference("Customer");

        ratingRef.child(RandomID).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for(DataSnapshot ds : snapshot.getChildren()) {
                        for (DataSnapshot dataSnapshot : ds.child("rating").getChildren()) {

                            if (ds != null){
                                Toast.makeText(RibsAndPowerboats.this, "It is: "+ds.child("rating").getValue(), Toast.LENGTH_SHORT).show();
                            }
                        }
                }

但通过这种方式,它会显示NaN,而不是应该显示的数字。我的 Firebase 数据库如下:

"Customer" : {
    "Xqve54QUwwPo3NyZhcs2z4wkETB2" : {
      "3086181c-c391-4bab-a022-0a0e0bb2624c" : {
        "rating" : 4.5,
        "review" : "γγυηωυηη"
      },
      "Name" : "Ntinakos",
      "Password" : "123456789"
    },
    "mW5TtA3GxjNaaj3lAFcAFF3moQ22" : {
      "Name" : "Αχιλλέας",
      "Password" : "Achisyg_15"
    }
  }

那么,还有其他方法可以检索所有 userId 下的数据吗?

【问题讨论】:

  • “所有userIds下的数据”是什么意思?您能否指出您想要获取的确切数据?
  • @AlexMamo 我只需要从每个客户那里检索“评分”值。

标签: java android firebase firebase-realtime-database


【解决方案1】:

要获取每个客户下存在的评分值,您需要循环两次 DataSnapshot 对象。所以请尝试以下代码行:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference customerRef = rootRef.child("Customer");
customerRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            DataSnapshot dataSnapshot = task.getResult();
            if (dataSnapshot != null) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    if (snapshot != null) {
                        for (DataSnapshot ds : snapshot.getChildren()) {
                            Double rating = ds.child("rating").getValue(Double.class);
                            if (rating != null) {
                                Log.d(TAG, "rating: " + rating);
                            }
                        }
                    }
                }
            }
        } else {
            Log.d(TAG, task.getException().getMessage()); //Don't ignore potential errors!
        }
    }
});

logcat 中的结果将是:

rating: 4.5

【讨论】:

  • 现在显示java.lang.NullPointerException: Attempt to invoke virtual method 'double java.lang.Double.doubleValue()' on a null object reference错误
  • 是的,确实如此。对不起这是我的错。请检查我更新的答案。现在可以用了吗?
  • 现在运行完美。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-03-03
  • 2017-06-10
  • 1970-01-01
  • 2021-11-28
  • 2022-01-21
  • 2019-05-03
  • 1970-01-01
相关资源
最近更新 更多