Как пропустить уникальный идентификатор пользователя и получить доступ к его дочерним значениям для представления переработчика - PullRequest
0 голосов
/ 03 июня 2019

Я создал RecyclerView, который показывает информацию о местах, которые я сохранил в Firebase. Каждое местоположение сохраняется в уникальном идентификаторе пользователя, но я хочу, чтобы RecyclerView показывал ВСЕ местоположения независимо от того, в каком ИД пользователя они сохранены.

Моя база данных выглядит так

User Locations
---ih4flEIASsgs7tk5tFSBFNw1R8U2
------Bay tower lounge
-----------name
-----------location
------China Sichuan
-----------name
-----------location
---juh972y271bhw281732h2j31h2hh
------Greene lounge
-----------name
-----------location
------Hotel Canal
-----------name
-----------location

Я хочу отображать такие результаты, как зал "Bay Bay", Китай Сычуань, "Green Lounge", канал отеля, независимо от длинного идентификатора пользователя.

Я успешно реализовал представление рециркулятора, которое отображает местоположения, опубликованные пользователем, но я не знаю, как разместить все местоположения независимо от пользователя.

public void startListening() {
        FirebaseUser user = mAuth.getCurrentUser();
        String userID = user.getUid();
        Query query = FirebaseDatabase.getInstance()
                .getReference()
                .child("User Locations")
                .child(userID)
                .orderByChild("time")
                .limitToLast(20);


        FirebaseRecyclerOptions<LocationInformation> options =
                new FirebaseRecyclerOptions.Builder<LocationInformation>()
                        .setQuery(query, LocationInformation.class)
                        .build();
        FirebaseRecyclerAdapter adapter = new FirebaseRecyclerAdapter<LocationInformation, UserViewHolder>(options) {
            @Override
            public UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                // Create a new instance of the ViewHolder, in this case we are using a custom
                // layout called R.layout.message for each item
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.feed_layout, parent, false);

                return new UserViewHolder(view);


            }

            @Override
            protected void onBindViewHolder(UserViewHolder holder, int position, LocationInformation model) {

                holder.setName(model.name);
                holder.setRating(model.rating);
                holder.setAddress(model.address);
                holder.setTime(model.time);

                //holder.setRating(model.rating);

                final String name = getRef(position).getKey();
                //final float rateValue = getRef(position).getKey();


            }
        };
        mRecyclerFeed.setAdapter(adapter);
        adapter.startListening();

    }

Я новичок и испытываю нехватку времени, поэтому, пожалуйста, если вы можете мне помочь, можете ли вы оставить ответ с подробным и конкретным описанием того, как я могу это исправить? большое спасибо :)

UPDATE:

Я добавил этот код, который предназначен для циклического обхода моей базы данных и возврата всех местоположений для каждого из пользователей, НО он просто возвращает местоположения одного пользователя - этот пользователь фактически не является тем пользователем, в котором я вошел в систему, так что я знаю, что это близко к работе, но не полностью. Может ли кто-нибудь указать, что мне нужно изменить, чтобы ВСЕ местоположения пользователей публиковались, а не только один пользователь? благодарю вас!!! :)

'' '' '' '

private void getPastUserIds(){
    //locationReference = FirebaseDatabase.getInstance().getReference().child("User Locations");
    locationsDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange( DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists()){
                for(DataSnapshot locations : dataSnapshot.getChildren()){
                    startListening(locations.getKey());
                }
            }
        }

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

        }
    });
}

'' ''

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Самое простое и эффективное решение, которое я могу придумать, - это дублировать ваши данные.Эта практика называется денормализация и является обычной практикой, когда дело доходит до Firebase.Для лучшего понимания, я рекомендую вам посмотреть это видео, Денормализация нормальная с базой данных Firebase .

Так что в вашем случае вы должны создать в вашей базе данных новый узел с именем allUserLocationsи добавить туда все локации независимо от пользователя.Ваш новый узел должен выглядеть следующим образом:

allUserLocations
------Bay tower lounge
-----------name
-----------location
------China Sichuan
-----------name
-----------location
------Greene lounge
-----------name
-----------location
------Hotel Canal
-----------name
-----------location

Если у вас также есть свойство time, вы можете использовать его в своем запросе для упорядочения местоположений.

Кроме того, когда выдублируя данные, нужно помнить одну вещь.Точно так же, как вы добавляете данные, вы должны поддерживать их.Другими словами, если вы хотите обновить / обнаружить элемент, вы должны делать это в каждом месте, где он существует.

0 голосов
/ 03 июня 2019

Попробуйте получить User Locations child таким образом:

//Declare a local variable userList 
ArrayList<String> userList = new ArrayList<String>();

 FirebaseDatabase.getInstance().getReference().addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot ds : dataSnapshot.getChildren()) {
            //child = your userID
            String child = ds.getKey();
            userList.add(child)
        }
    }

Теперь, когда у вас есть список всех идентификаторов userID, вы можете сделать цикл в этом списке и выполнить свой запрос

Редактировать:

public void startListening(String user) {
        FirebaseUser user = mAuth.getCurrentUser();
        String userID = user.getUid();
        Query query = FirebaseDatabase.getInstance()
                .getReference()
                .child("User Locations")
                .child(user)
                .orderByChild("time")
                .limitToLast(20);
                  ......   
                  .....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...