我有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数据库
答案 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)));
}
}