繁体   English   中英

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

[英]Android Firebase Database checking if user is in specific group

我有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数据库

更改此:

if (staffType == "servers"){
mTitles = new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.menuUser)));
}

到这个:

if (staffType.equals("servers")){
mTitles = new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.menuUser)));
}

从文档:

public boolean equals(Object anObject)

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

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

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

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

因此, onDataChange的代码需要通过遍历dataSnapshot.getChildren()来处理可能的多个子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)));
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM