【问题标题】:Android Firebase Database Check if User is in GroupAndroid Firebase 数据库检查用户是否在组中
【发布时间】:2017-12-02 02:47:32
【问题描述】:

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

我正在使用具有这些结构的 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 是否为空

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) {
                //

在这个查询之后我需要一个简单的真或假

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

只是或更好地突出显示

key 是我的用户 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);

【问题讨论】:

    标签: android firebase firebase-realtime-database usergroups


    【解决方案1】:

    像这样在你的 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
                        }
                    }
                });
    

    【讨论】:

    • 谢谢会试一试
    【解决方案2】:

    您需要在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 是您要验证的成员的名称。这样就可以验证成员的存在了。

    希望对你有帮助。

    【讨论】:

    • 我的数据库布局是:Benutzer/$UID/groups/admins(是真还是假)并且在我的组 /groups/admins/members/usernames = true 所以在你的代码中我必须使用这个? [..] = rootRef.child("groups").child("admins").child("members").child("USERID").child(memberName);什么是会员名?哦,好吧,我想 MemberName 是我的用户 ID,我会试试看
    • 是的,您需要在树中向下到达组节点,您需要在其中进行验证。所以如果这些是正确的孩子,是的,试一试。 memberName 是您要验证的成员的姓名。
    • 好的,非常感谢!另一个问题:这是一个“快速”的解决方案吗?在我的最终应用程序中,我必须检查大约 100 个孩子(用户)的状态我的查询检查了 100 多个用户,但它有效,现在我理解这个 .exist() 方法谢谢 =)
    • 很高兴听到这个消息。这是一个很好的解决方案,因为您正在检查特定组的成员。如果你想学习更复杂的东西,我建议你看看这篇文章,Structuring your Firebase Data correctly for a Complex App
    • 正如您在memberDatabaseReference 中看到的,我们只下载一个特定组,注意整个节点(不是每个组)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2019-01-17
    • 1970-01-01
    相关资源
    最近更新 更多