如何检查Firebase中是否已经存在值并在android中获取密钥

如何检查Firebase中是否已经存在值并在android中获取密钥,android,firebase-realtime-database,Android,Firebase Realtime Database,在我的android应用程序中,当用户登录时,我需要检查我的实时数据库,以确定该数据库中是否存在用户ID。找到用户ID后,我需要检索该ID的父节点,以确定登录的用户是客户还是员工。我在编写代码时遇到了一些困难,因为我对使用firebase比较陌生 以下是我目前的代码: final String user_id = Objects.requireNonNull(firebaseAuth.getCurrentUser()).getUid(); DatabaseReference rootRef =

在我的android应用程序中,当用户登录时,我需要检查我的实时数据库,以确定该数据库中是否存在用户ID。找到用户ID后,我需要检索该ID的父节点,以确定登录的用户是客户还是员工。我在编写代码时遇到了一些困难,因为我对使用firebase比较陌生

以下是我目前的代码:

final String user_id = Objects.requireNonNull(firebaseAuth.getCurrentUser()).getUid();

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
ValueEventListener eventListener = new ValueEventListener()
{
    @Override
    public void onDataChange(DataSnapshot dataSnapshot)
    {
        for(DataSnapshot ds : dataSnapshot.getChildren())
        {
            if(ds.child(user_id).exists())
            {
                //check if employee or customer?
                String cust_or_emp =  ds.child(user_id).getKey();
                Log.d("test1",String.valueOf(ds.child(user_id).getKey()));
                if (cust_or_emp.equals("Customers"))
                {
                            name= Objects.requireNonNull(ds.child(user_id).child("User_Information").child("firstName").getValue()).toString();
                            Log.e("first name is ", "firstname :" + name);
                            toNextActivity = new Intent(getActivity(), MainActivity.class);
                            toNextActivity.putExtra("name",name);
                            Log.e("2first name is ", "firstname :" + name);
                            progressBarLayout2.setVisibility(View.GONE);
                            Objects.requireNonNull(getActivity()).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
                            Objects.requireNonNull(getActivity()).startActivity(toNextActivity);
                            getActivity().finish();
                } else if (cust_or_emp.equals("Employee")) {
                    //code for if the key is employee
                }
            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError)
    {
        Log.d("error", databaseError.getMessage()); //Don't ignore errors!
    }
};
rootRef.addListenerForSingleValueEvent(eventListener);


当前,当我运行应用程序时,似乎什么也没有发生。

您正在将一个值侦听器附加到数据库的根目录。然后在
onDataChange
中循环子节点,这意味着
ds
快照是为
用户
节点创建的,而您似乎认为它是为
员工
客户
节点创建的

修复方法应该是监听
用户
节点:

rootRef.child("Users").addListenerForSingleValueEvent(eventListener);

您当前的方法效率很低,因为(即使在修复上述问题时)您正在加载整个
用户
节点,以检查其中是否存在特定用户。当您向应用程序添加更多用户时,这意味着您正在加载越来越多的数据,而不使用它

更好的方法是检查每个特定节点下是否存在特定用户:

rootRef.child("Users/Employee").child(user_id).addListenerForSingleValueEvent(new new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            ... handle the Employee
        }
        else {
            rootRef.child("Users/Customer").child(user_id).addListenerForSingleValueEvent(new new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if (dataSnapshot.exists()) {
                        ... handle the Customer
                    }
                }

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

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

您正在将值侦听器附加到数据库的根目录。然后在
onDataChange
中循环子节点,这意味着
ds
快照是为
用户
节点创建的,而您似乎认为它是为
员工
客户
节点创建的

修复方法应该是监听
用户
节点:

rootRef.child("Users").addListenerForSingleValueEvent(eventListener);

您当前的方法效率很低,因为(即使在修复上述问题时)您正在加载整个
用户
节点,以检查其中是否存在特定用户。当您向应用程序添加更多用户时,这意味着您正在加载越来越多的数据,而不使用它

更好的方法是检查每个特定节点下是否存在特定用户:

rootRef.child("Users/Employee").child(user_id).addListenerForSingleValueEvent(new new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            ... handle the Employee
        }
        else {
            rootRef.child("Users/Customer").child(user_id).addListenerForSingleValueEvent(new new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if (dataSnapshot.exists()) {
                        ... handle the Customer
                    }
                }

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

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