如何根据id授予Firebase数据库中某些对象的访问权限

时间:2017-11-15 13:14:05

标签: android firebase firebase-realtime-database

我有这个数据结构:

Screenshot of firebase database

红色箭头指向动物ID,蓝色箭头指向用户ID。每个用户都有一个或多个动物。

我尝试过不同的方法,只显示存储在当前用户节点中的id的动物。

示例:如果我有 SELECT productID FROM cart WHERE orderID IN( SELECT orderId FROM cart WHERE productID = 333 AND status = 'complete' ) AND productID <> 333 AND status = 'complete' (“用户”中的第一个),我想显示以下数据:“dog2”和“dog3”。

现在我有以下代码从数据库中的“animals”节点获取快照,然后从每个子节点获取数据。

UID = 48onHXIxgDP465j5WW16oo7psNm2

如何让我的代码过滤掉每个在用户节点中没有ID的动物?

我想让用户使用存储在数据库中的UID进行访问的原因是因为我以后想要使用多个用户可以访问同一个动物。

3 个答案:

答案 0 :(得分:1)

要实现此目的,您需要两次查询数据库。请使用以下代码:

FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
String uid = firebaseUser.getUid();

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = usersRef.child("users").child(uid);
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String aid = ds.getKey();

            DatabaseReference animalRef = rootRef.child("animals").child(aid);
            ValueEventListener valueEventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dSnapshot) {
                    int age = dSnapshot.child("age").getValue(Integer.class);
                    String name = dSnapshot.child("name").getValue(String.class);
                    String url = dSnapshot.child("url").getValue(String.class);
                    Log.d("TAG", age + " / " + name + " / " + url);
                }

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

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
uidRef.addListenerForSingleValueEvent(eventListener);

其中uid是登录用户的ID,aid是动物的ID。您的输出将是:

11 / dog1 / http...
12 / dog2 / http...

答案 1 :(得分:1)

希望您觉得这很有帮助。 在模型类中获取对象并将该对象存储在列表中以供更多用户使用。 您可以使用

获取特定对象
mdatabaseRef.child("animals").orderByChild().equalTo("value") 

您还可以通过orderByKey()

添加对密钥的检查
    private FirebaseAuth mAuth;

    private FirebaseDatabase mdatabase;

    private DatabaseReference mdatabaseRef;


mAuth = FirebaseAuth.getInstance();
mdatabase = FirebaseDatabase.getInstance();
mdatabaseRef = mdatabase.getReference();

 ArrayList<User> allUserList = new ArrayList<>();
 Array<Animal> allAnimalList=new ArrayList<>();

mdatabaseRef.child("animals").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {


        for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
            String key = childSnapshot.getKey();

            Animal animal = childSnapshot.getValue(Animal.class);
            allAnimalList.add(animal );
        }




    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});




mdatabaseRef.child("users").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {


        for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
            String key = childSnapshot.getKey();

            User user = childSnapshot.getValue(User .class);
            allUserList.add(user);
        }




    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

答案 2 :(得分:0)

我最终接受了Alex Mamo的回答并稍微调了一下。

这是我使用的代码:

       uid = currentUser.getUid();
    mRootRef = FirebaseDatabase.getInstance().getReference();
    final DatabaseReference myUserRef = mRootRef.child("users").child(uid);

    Log.d(TAG1, uid);

    myUserRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            list = new ArrayList<AnimalCard>();
            for(DataSnapshot ds : dataSnapshot.getChildren()){
                String aid = ds.getKey();

                DatabaseReference myAnimalRef = mRootRef.child("animals");

                Query query = myAnimalRef.orderByKey().equalTo(aid);
                query.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        for (DataSnapshot ds2 : dataSnapshot.getChildren()){

                            AnimalCard value = ds2.getValue(AnimalCard.class);
                            AnimalCard animal = new AnimalCard();
                            String name = value.getName();
                            int age = value.getAge();
                            String url = value.getUrl();
                            animal.setName(name);
                            animal.setAge(age);
                            animal.setUrl(url);
                            list.add(animal);


                        }
                        recyclerViewSetAdapter();
                        progressDialog.dismiss();
                    }
                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
            }

        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }

    });

主要区别在于我使用查询来过滤掉每个没有当前用户拥有的aID的动物。