无法使用dataSnapshot从Firebase检索数据

时间:2019-04-28 14:24:40

标签: java android firebase

我的Firebase数据库如下所示 enter image description here 我正在尝试为“ alind”以及其他子节点“ kartik”检索“ a”的值 我正在使用Android Studio。 但我收到此错误-

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
        at com.example.minorproject.facultyfreeslots.matchslots(facultyfreeslots.java:119)
        at com.example.minorproject.facultyfreeslots$1.onClick(facultyfreeslots.java:48)
        at android.view.View.performClick(View.java:6614)

我尝试设置不同的路径以使用Datasnapshot访问此路径。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_facultyfreeslots);
        t1=findViewById(R.id.textView50);
        name=findViewById(R.id.editText4);
        name2=findViewById(R.id.editText5);
        b1=findViewById(R.id.button9);
        day=findViewById(R.id.spinner18);
        time=findViewById(R.id.spinner19);
        FirebaseApp.initializeApp(this);
        d1= FirebaseDatabase.getInstance().getReference("teacher");
        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                matchslots();
            }
        });
    }
void matchslots()
    {  // getdata();
        name11=name.getText().toString();
        name12=name.getText().toString();
        daystring=day.getSelectedItem().toString().trim();
        timestring=time.getSelectedItem().toString().trim();
        d1.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                dvalue1=dataSnapshot.child(name11).child(daystring).child(timestring1).getValue().toString().trim();
                dvalue2=dataSnapshot.child(name12).child(daystring).child(timestring1).getValue().toString().trim();
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d(TAG, "Failed to read value.");
            }
        });
 //line119- 
  if(dvalue1.equals("no class"))
        {
            a=0;
        }

        else {
            a=1;
        }
        if(dvalue2.equals("no class"))
        {
            b=0;
        }
        else
        {
            b=1;

I want to get the value of a or b or c. nam11=alind or any othername, daystring="monday"/"tuesday" etc
timestring="a"/"b"/"c" etc



1 个答案:

答案 0 :(得分:2)

由于onDataChange()是异步的,因此您必须执行以下操作:

d1.addValueEventListener(new ValueEventListener() {
 @Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
   dvalue1=dataSnapshot.child(name11).child(daystring).child(timestring1).getValue().toString().trim();
   dvalue2=dataSnapshot.child(name12).child(daystring).child(timestring1).getValue().toString().trim();
   if(dvalue1.equals("no class"))
    {
        a=0;
    }

    else 
    {
        a=1;
    }
    if(dvalue2.equals("no class"))
    {
        b=0;
    }
    else
    {
        b=1;
     }
   }
 @Override
public void onCancelled(@NonNull DatabaseError databaseError) {
 Log.d(TAG, "Failed to read value.");
  }
});

在检索所有数据之前运行侦听器之后的代码,因此会出现错误dvalue1为空。