Java Android:如何获取push()的键值
我正在制作一个反馈应用程序,客户必须提交一个评分(1-5),并将数据推送到Firebase实时数据库。Firebase中的数据库如下所示-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"
{
"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()。如果有新问题,请单独发布。堆栈溢出不是一个非常有效的调试器。