我正在尝试获取用户的管理员权限,无论是真还是假。我不认为我得到当前登录的用户详细信息,下面的代码是我所拥有的,但是当我调试它时,似乎它遍历firebase表中的所有用户,如果有的话,它将按钮设置为可见
databaseUsers = FirebaseDatabase.getInstance().getReference("users");
// buttonAddProducts.setVisibility(View.GONE);
// buttonAddBeverages.setVisibility(View.GONE);
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference currentUserReference = databaseUsers.child(uid);
currentUserReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot userSnapshot) {
if (userSnapshot.exists()) {
User user = userSnapshot.getValue(User.class);
if(user.getAdminUser() == true)
{
buttonAddProducts.setVisibility(View.VISIBLE);
buttonAddBeverages.setVisibility(View.VISIBLE);
}
}
else{
Log.i("myInfoTag", "Connection problem");
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException(); // don't ignore exceptions
}
});
答案 0 :(得分:1)
首先,当我们提到Firebase时,我们不能谈论表格。在NoSQL数据库中没有表。只有键和值对。
要解决您的问题,我需要通过在名为userAdmins
的Firebase数据库中添加新节点来重新编辑数据库。将用户添加到数据库中并且也是管理员时,请在此新部分中添加他。您的新节点应如下所示:
Firebase-root
|
--- userAdmins
|
--- userId1: true
|
--- userId2: true
此练习名为 denormalization
,为此我重新命名,您会看到此视频Denormalization is normal with the Firebase Database。如果您看到此视频,您将对这种做法有更好的了解。
要验证用户是否为管理员,只需在exists()
对象上使用DataSnapshot
方法,如下所示:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("userAdmins").child(uid);
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()) {
//do something
} else {
//do something else
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
uidRef.addListenerForSingleValueEvent(eventListener);
其中uid
是您要验证的用户的ID是否为管理员。
答案 1 :(得分:0)
您正在侦听所有用户,然后循环播放这些用户,如果其中任何一个是管理员,则会显示按钮。
如果您只想显示当前用户的按钮,则只应查询当前用户。在您当前的数据模型中,可以是:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference currentUserReference = databaseUsers.child(uid);
currentUserReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
User user = venueSnapshot.getValue(User.class);
if(user.getAdminUser() == true)
{
buttonAddProducts.setVisibility(View.VISIBLE);
buttonAddBeverages.setVisibility(View.VISIBLE);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException(); // don't ignore exceptions
}
});
这不仅可以为您提供所需的行为,还可以大幅减少应用使用的带宽。