Android Firebase数据库检查用户是否在特定组中

时间:2018-12-08 11:50:11

标签: java android firebase firebase-realtime-database

我有5种不同的用户类型,我想检查某个用户是否属于4种特殊用户类型之一,并根据该用户类型更改菜单ui。这是我自己发现的,但是不起作用。

mDatabase.child("staff").orderByChild(mAuth.getUid()).equalTo("true").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                String staffType = dataSnapshot.getKey();
                if (staffType == "servers"){
                    mTitles = new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.menuUser)));
                }
            }

我的Firebase数据库

2 个答案:

答案 0 :(得分:1)

更改此:

  if(staffType ==“ servers”){
mTitles =新的ArrayList <>(Arrays.asList(getResources()。getStringArray(R.array.menuUser))));
}
 

对此:

  if(staffType.equals(“ servers”)){
mTitles =新的ArrayList <>(Arrays.asList(getResources()。getStringArray(R.array.menuUser))));
}
 

来自文档:

  

公共布尔值equals(Object anObject)

     

将此字符串与指定对象进行比较。当且仅当参数不为null并且是一个String对象,该对象表示与此对象相同的字符序列时,结果为true。

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#equals(java.lang.Object)

答案 1 :(得分:0)

Peter的答案突出了一个问题,但是您的代码还有另外一件事。

对Firebase数据库执行查询时,可能会有多个结果。因此,快照包含这些结果的列表。即使只有一个结果,快照也将包含一个结果的列表。

因此,onDataChange中的代码需要通过遍历dataSnapshot.getChildren()来处理这个潜在的多个子级:

public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
  for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
    String staffType = userSnapshot.getKey();
    if (staffType.equals("servers")){
        mTitles = new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.menuUser)));
    }
}

尽管支票可以处理这些更改,但由于需要查看太多数据才能找到所需的用户,因此它在规模上永远不会高效。您当前的数据结构使您可以有效地查找给定角色的所有用户。但是,它不允许有效查找特定用户的角色。为此,您应该添加具有该信息的其他数据结构:每个UID的角色。像这样:

user-roles
  "22yXY813cW...": "server"
  "uid2": "cook"

使用此附加结构,您可以有效地查找用户的角色而无需查询:

mDatabase.child("user-roles").child(mAuth.getUid()).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        String staffType = dataSnapshot.getKey();
        if (staffType.equals("servers")){
            mTitles = new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.menuUser)));
        }
    }