Java 未使用firebase数据库访问调用onChange方法

Java 未使用firebase数据库访问调用onChange方法,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我在通过Java进行查询和读取firebase数据库时遇到问题。我正在尝试保存登录用户的电子邮件,但似乎从未调用onChangeMethod。 我在firebase中检查了数据库规则和sha1指纹。 代码如下: import android.util.Log; import androidx.annotation.NonNull; import com.google.firebase.database.DataSnapshot; import com.google.firebase.data

我在通过Java进行查询和读取firebase数据库时遇到问题。我正在尝试保存登录用户的电子邮件,但似乎从未调用onChangeMethod。 我在firebase中检查了数据库规则和sha1指纹。 代码如下:

import android.util.Log;

import androidx.annotation.NonNull;

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.Query;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;

public class LockerDatabase implements ValueEventListener{
    private FirebaseDatabase database;
    private DatabaseReference reference;

    private User currUser;
    private ArrayList<Password> passwords;

    public int count;

    public LockerDatabase(String email, String name) {
        database = FirebaseDatabase.getInstance();
        reference = database.getReference();

        currUser = new User();
        passwords = new ArrayList<>();

        if (!exists(email))
            createUser(email, name);
        else
            loadPasswords();
    }

    private void loadPasswords() {
        //TODO: read from db all passwords
    }

    public String getEmail(){
        return currUser.getEmail();
    }

    private void createUser(String email, String name) {
        currUser.setEmail(email);
        currUser.setName(name);
        currUser.setHashId(Integer.toString(email.hashCode()));

        //TODO: add user to database
    }

    private boolean exists(String email) {
        Query existence = reference.child("users").child(Integer.toString(email.hashCode()));
        existence.addValueEventListener(this);

        if (currUser == null)
            return false;
        else
            return true;
    }

    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        currUser.setEmail((String)dataSnapshot.child("email").getValue());
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.w("CAN", "user_cancelled", databaseError.toException());
    }
以下是数据库:

我不明白我的问题是由于响应时间,还是由于代码中的某些错误。
谢谢大家!

不要将
Integer.toString(email.hashCode())
作为孩子使用,如果使用firebase身份验证,可以使用将生成随机密钥的
push()
方法,或者使用用户
uid

如果使用
push()
,则首先存储密钥:

String key  = reference.child("users").push().getKey();
然后,如果要检索数据,请执行以下操作:

Query existence = reference.child("users").child(key);
existence.addValueEventListener(this);

您是否调试或打印了onDataChange日志中的任何内容?是否触发了
exists()
方法?请同时回复@AlexMamo@Piyush我曾尝试在exists()和onDataChange()上打印相同的内容,但仅在第一个中有效。@AlexMamo创建LockerDatabase对象时,该方法被调用一次。值为“Integer.toString(email.hashCode())”?请将您的数据库结构添加为JSON文件或至少是屏幕截图。
Query existence = reference.child("users").child(key);
existence.addValueEventListener(this);