【问题标题】:Float is returning null in datasnapshot loop浮点数在数据快照循环中返回 null
【发布时间】:2021-08-05 23:01:32
【问题描述】:

好吧,我正在尝试从Firebase 检索评级数据,以计算rating bar 的平均值。下面是检索数据的代码。

DatabaseReference ratingRef = FirebaseDatabase.getInstance().getReference("Rating");

ratingRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        double count = 0;
        for(DataSnapshot ds : snapshot.getChildren()) {
            //Toast.makeText(RibsAndPowerboats.this, "it is "+ds, Toast.LENGTH_SHORT).show();
            double rating = Double.parseDouble(ds.child(RandomID).child("rating").getValue().toString());
            count = count + rating;
        }
        double avarage = count / snapshot.getChildrenCount();
        if (avarage == 0) {
            ratingBar.setRating(avarage);
        } else {
            Toast.makeText(RibsAndPowerboats.this, "it is" + avarage, Toast.LENGTH_SHORT).show();

        }

    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        throw error.toException();
    }
});

这里是 SubmitRatingActivity:

String RandomID = getIntent().getStringExtra("RandomID");

if (RandomID != null){

    String userId = FirebaseAuth.getInstance().getCurrentUser().getUid();
    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Rating");

    SubmitScore.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            float RatedValue = ratingBar.getRating();
            databaseReference.child(RandomID).child(userId).child("rating").setValue(RatedValue);
            String SaveReview = AddReview.getText().toString();
            String ScoreStrg = Float.toString(RatedValue);
            Score.setText(ScoreStrg+" out of 5");
            databaseReference.child(RandomID).child(userId).child("review").setValue(SaveReview);
            Toast.makeText(SubmitRating.this, "Ευχαριστούμε!", Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(SubmitRating.this, RibsAndPowerboats.class);
            startActivity(intent);
            finish();
        }
    });
}

这是我的 firebase 数据库:

"Rating" : {
    "3086181c-c391-4bab-a022-0a0e0bb2624c" : {
      "Xqve54QUwwPo3NyZhcs2z4wkETB2" : {
        "rating" : 4,
        "review" : "Βδησηαησησσησησ"
      }
    }
  }

我尝试将变量从 double 更改为 float 和 long,但没有任何变化。问题是什么?出现的错误是:

尝试在空对象引用上调用虚拟方法“java.lang.String java.lang.Object.toString()”

【问题讨论】:

  • 您在问题中包含了 JSON 树的图片。请将其替换为实际的 JSON 作为文本,您可以通过单击 your Firebase Database console 的溢出菜单 (⠇) 中的 Export JSON 链接轻松获得。请同时显示多个子节点,以便我们了解您正在阅读的内容的更多上下文。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。
  • @FrankvanPuffelen 我做到了,伙计。感谢您的详细评论!
  • 谢谢。 RandomID 的确切值是多少?如果您对该值进行硬编码,您是否也可以重现该问题?如果是这样,请显示带有硬编码值的代码,这样我们就不必跟踪变量了。
  • 应该可以找出正在打印的对象是null,尤其是通过堆栈跟踪检查它在哪一行。
  • @FrankvanPuffelen 我不知道如何硬编码这个值。但是当我打开应用程序时它会崩溃并显示我在上面附加的错误。

标签: java android firebase firebase-realtime-database


【解决方案1】:

为了能够在所有用户对象中获取“评级”属性的值,请使用以下代码行:

String randomId = "3086181c-c391-4bab-a022-0a0e0bb2624c";
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference randomIdRef = rootRef.child("Rating").child(randomId);
randomIdRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            for (DataSnapshot snapshot : task.getResult().getChildren()) {
                String rating = snapshot.child("rating").getValue(String.class);
                Log.d("TAG", "rating:" + rating);
            }
        } else {
            Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
        }
    }
});

logcat 中的结果将是每个 User 对象下存在的 rating 属性的所有值。

【讨论】:

  • 非常感谢。你是一个救生员!
  • 既然问题中的JSON将rating显示为一个数字,那么snapshot.child("rating").getValue(String.class)不会返回null吗?
  • @FrankvanPuffelen 是的,没错。我的错,刚刚更新了我的答案。
猜你喜欢
  • 2020-08-05
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 2020-11-07
  • 2021-10-02
相关资源
最近更新 更多