Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:如何获取push()的键值_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java Android:如何获取push()的键值

Java Android:如何获取push()的键值,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在制作一个反馈应用程序,客户必须提交一个评分(1-5),并将数据推送到Firebase实时数据库。Firebase中的数据库如下所示- { "Users" : { "-MCHoOShwgxPE3u2drjz" : { "Arpit Mundra" : { "name" : "Arpit Mundra", "rating"

我正在制作一个反馈应用程序,客户必须提交一个评分(1-5),并将数据推送到Firebase实时数据库。Firebase中的数据库如下所示-

{
  "Users" : {
    "-MCHoOShwgxPE3u2drjz" : {
      "Arpit Mundra" : {
        "name" : "Arpit Mundra",
        "rating" : 5
      }
    },
    "-MCHqbF4UvX02OYJNuPv" : {
      "Ankit Mundra" : {
        "name" : "Ankit Mundra",
        "rating" : 5
      }
    },
    "-MCHr-q_amx1vBJkyq2S" : {
      "Harsh Chauhan" : {
        "name" : "Harsh Chauhan",
        "rating" : 5
      }
    }
  }
}
现在,我想计算属于user的所有用户的
评分的平均值,而user又属于push()id。我的问题是如何获取唯一的push()id以从中提取评分值

这是密码-

package com.example.feedback;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AppCompatActivity;

import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

public class Score extends AppCompatActivity {

    TextView avgScore;
    DatabaseReference dbRef;
    String mGroupID = dbRef.child("Users").push().getKey();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE); //will hide the title
        getSupportActionBar().hide(); // hide the title bar
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN); //enable full screen
        setContentView(R.layout.score);
        avgScore = findViewById(R.id.textView2);
        dbRef = FirebaseDatabase.getInstance().getReference().child(mGroupID);

        scoreRealTime();
    }

    public void scoreRealTime() {
        dbRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                double total = 0;
                for (DataSnapshot ds : snapshot.getChildren()){
                    double values = Double.parseDouble(ds.child("rating").getValue().toString());
                    total = total + values;
                }
                double average = (double) total / snapshot.getChildrenCount();
                avgScore.setText(String.format("%.2f", average));
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
            }
        });
    }
}
它正在字符串
mGroupID=dbRef.child(“用户”).push().getKey()处抛出NullPointerException错误


提前感谢您的帮助。

您的代码在分配值之前正在尝试使用dbRef:

DatabaseReference dbRef;
String mGroupID = dbRef.child("Users").push().getKey();
dbRef
最初为空。直到稍后调用
onCreate
时,它才获得值。您需要做的是等待dbRef有一个值,然后再对其调用方法。不要立即分配
mGroupID
,而是在
dbRef
有值之后移动分配

dbRef = FirebaseDatabase.getInstance().getReference().child("Users");
mGroupID = dbRef.push().getKey();

您只需获取用户快照,然后获取对象的评级`

 databaseReference = FirebaseDatabase.getInstance().getReference().child("Users");

         databaseReference .addValueEventListener(new ValueEventListener() {

    @Override

    public void onDataChange(@NonNull DataSnapshot snapshot) {

        double total = 0;

        for (DataSnapshot ds : snapshot.getChildren()){

      UserHelper helper = ds.getValue(UserHelper.class);

            double values =
         Double.parseDouble(helper.rating);

            total = total + values;

        }

        double average = (double) total / snapshot.getChildrenCount();

            avgScore.setText(String.format("%.2f", average));

         }

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

我也尝试了这个解决方案,但它抛出了一个错误,说“不能为child()中的参数'pathString'传递null”。这可能是因为在dbRef=FirebaseDatabase.getInstance().getReference().child(mGroupID)中传递时,mGroupID为null;然后,出于完全相同的原因,在使用它之前,您必须弄清楚mGroupId是什么。你不能让他们彼此依赖。一个人必须先来。我通过修改我的答案提出了一个建议。您必须验证它是否适用于类的其余部分;表示不能在空对象上执行toString()。如果有新问题,请单独发布。堆栈溢出不是一个非常有效的调试器。