如何检查Firebase中是否已经存在值并在android中获取密钥
在我的android应用程序中,当用户登录时,我需要检查我的实时数据库,以确定该数据库中是否存在用户ID。找到用户ID后,我需要检索该ID的父节点,以确定登录的用户是客户还是员工。我在编写代码时遇到了一些困难,因为我对使用firebase比较陌生 以下是我目前的代码:如何检查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 =
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();
}
}