How can I give access to certain objects in Firebase database based on id

谁说胖子不能爱 提交于 2019-12-25 09:41:09

问题


I have this data structure:

The red arrows points at animal IDs, and the blue arrow points at user IDs. Every user have one or many animals.

I have tried different methods for showing only the animals that have id that is stored in the current user node.

Example: If I have UID = 48onHXIxgDP465j5WW16oo7psNm2 (the first one in "users") I want to show the data from: "dog2" and "dog3".

Now iIhave the following code that gets snapshot from the "animals" node in the database, and then gets data from every child.

     myAnimalRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            list = new ArrayList<AnimalCard>();
            for(DataSnapshot dataSnapshot1 :dataSnapshot.getChildren()){

                AnimalCard value = dataSnapshot1.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) {
            Log.d(TAG1, "failed to read value: " + databaseError.toException());
        }
    });

How can get my code to filter out every animal that does not have their ID in the user node?

The reason I want to make the user get access with an UID stored in the database is because later on I want to make it so that multiple users can get access to the same animal.


回答1:


To achieve this, you need to query your database twice. Please use the following code:

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);

In which uid is the id of the logged-in user and aid is the id of the animal. Your output will be:

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



回答2:


Hope you find this helpfull.! Get Object in Your Model Class and Store that Object in List for Further user.! You can get specific object as well simple using

mdatabaseRef.child("animals").orderByChild().equalTo("value") 

and also you can add check on key by 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) {

    }
});



回答3:


I ended up taking Alex Mamo's answer and tweak with a litte bit.

This is the code i'am using:

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

    });

The main difference is that i'am using a query to filter out every Animal that does not have the aID that the currentUser have.



来源:https://stackoverflow.com/questions/47308356/how-can-i-give-access-to-certain-objects-in-firebase-database-based-on-id

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!