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

Android Firebase Database Check if User is in Group

您好,搜索了很多但找不到任何与我的主题相关的问题/或已回答。

我正在使用具有这些结构的 Firebase 数据库(来自 firebase 官方文档)

// An index to track Ada's memberships
{
  "users": {
    "alovelace": {
      "name": "Ada Lovelace",
      // Index Ada's groups in her profile
      "groups": {
         // the value here doesn't matter, just that the key exists
         "techpioneers": true,
         "womentechmakers": true
      }
    },
    ...
  },
  "groups": {
    "techpioneers": {
      "name": "Historical Tech Pioneers",
      "members": {
        "alovelace": true,
        "ghopper": true,
        "eclarke": true
      }
    },
    ...
  }
}

Docu 说:检查 /$uid/groups/$group_id 是否为 null

This approach, inverting the data by listing the IDs as keys and setting the value to true, makes checking for a key as simple as reading /users/$uid/groups/$group_id and checking if it is null. The index is faster and a good deal more efficient than querying or scanning the data.

但是我如何在 Java 代码中管理它?

有这样的东西吗?

mDatabase.child("table/foo").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                //

在这个查询之后我需要一个简单的 true 或 false

if(query) {
user is in Group
... else {
User is not in group

只是或更好地突出显示

密钥是我的用户ID

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference memberDatabaseReference = rootRef.child("groups").child(groupName).child("members").child(key);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (!dataSnapshot.exists()) {
            Log.d("TAG", "Member does not exist!");
        } else {
            Log.d("TAG", "Member exists!");
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
memberDatabaseReference.addListenerForSingleValueEvent(valueEventListener);

您需要对 dataSnapshot 对象使用 exists() 方法。所以,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference memberDatabaseReference = rootRef.child("groups").child(groupName).child("members").child(memberName);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (!dataSnapshot.exists()) {
            Log.d("TAG", "Member does not exist!");
        } else {
            Log.d("TAG", "Member exists!");
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
memberDatabaseReference.addListenerForSingleValueEvent(valueEventListener);

其中mamberName为您要验证的会员名称。这样你就可以验证一个成员的存在。

希望对您有所帮助。

像这样在您的 firebase 安全性中创建一个节点

{
    "rules":{
    "checkIfMemberIsInGroup":{
        "$groupId":{
            "$memberId":{
                ".read":false,
                ".write":"auth != null && !newData.exists() &&
                 root.child('groups').child($groupId).child('members').child($memberId).exists()"
            } 
        }
    }
}

然后用轻量查询检查用户是否属于组,让服务器占用带宽..

   FirebaseDatabase.getInstance().getReference().child("checkIfMemberIsInGroup")
            .child(groupName)
            .child(memberName)
            .setValue(null, new DatabaseReference.CompletionListener() {
                @Override
                public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
                    if (databaseError != null && databaseError.getCode() == DatabaseError.PERMISSION_DENIED) {
                        // user is not member of group
                    } else {
                        // user is member of group
                    }
                }
            });