Получение списка детей через Снимок базы данных - PullRequest
0 голосов
/ 16 февраля 2019

Возникли проблемы с получением дочерних узлов с помощью запроса.

Вот моя структура данных:

Firebase Structure

Мне удалосьуспешно запросить и получить данные, используя узел, выделенный «1» на изображении выше.Вот мой код:

databaseRecipes = FirebaseDatabase.getInstance().getReference().child("recipe");

Query query = databaseRecipes.orderByChild(userId).equalTo(true);

query.addListenerForSingleValueEvent(new ValueEventListener()
    {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            if(dataSnapshot.exists())
            {
                Toast.makeText(getApplicationContext(), "Results found!", Toast.LENGTH_LONG).show();

                arrayList.clear();
                for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren())
                {
                    Recipe recipe = dataSnapshot1.getValue(Recipe.class);
                    arrayList.add(recipe);
                }

                final RecipeAdapter recipeAdapter = new RecipeAdapter(getApplicationContext(), arrayList);
                recyclerView.setAdapter(recipeAdapter);
                recipeAdapter.notifyDataSetChanged();
            }
            else
            {
               // Toast.makeText(getApplicationContext(), "No retreivable results :(", Toast.LENGTH_LONG).show();
                Toast.makeText(getApplicationContext(), userId, Toast.LENGTH_LONG).show();
            }
        }

Однако я бы предпочел хранить все «избранное» вместе под своим отдельным узлом, как показано, выделено «2».(Там есть только один ребенок для целей тестирования, на практике их будет гораздо больше, поэтому было бы лучше сделать это таким образом.)

Используя этот код:

Query query = databaseRecipes.child("favourite").orderByChild(userId).equalTo(true);

IТакже пытались изменить ссылку на:

databaseRecipes = FirebaseDatabase.getInstance().getReference().child("recipe").child("favourite");

И запрос:

Query query = databaseRecipes.orderByChild(userId).equalTo(true);

Но в любом случае не получается никаких результатов.Я думаю, моя проблема в том, чтобы спросить детей из DataSnapshot:

for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) 

Но я целый день ходил кругами в кругу, пытаясь найти альтернативу (я думаю, что упускаю что-то очень простое- что еще более раздражает!), поэтому любая помощь будет принята с благодарностью.

Заранее извиняюсь за мои ужасные навыки рисования!

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

Если кто-то еще сталкивался с этим новичком в Firebase из фона SQL, Алекс дал твердую оценку.совет.

Создан новый узел:

New Data Structure

Код для запроса узла -

Ссылка на базу данных:

databaseFvourites = FirebaseDatabase.getInstance().getReference().child("favouriteRecipes").child(userId);

Запрос:

 Query query = databaseFvourites.orderByChild(userId).equalTo(true);

Структура данных, вероятно, может быть улучшена еще больше, но для моих нужд она отлично работает.

1 Ответ

0 голосов
/ 17 февраля 2019

Когда вы используете следующий запрос:

Query query = databaseRecipes.orderByChild(userId).equalTo(true);

Все работает нормально, потому что ваш uid является свойством в вашем -LY18 ... hFqO объекте.

Следующий запрос:

Query query = databaseRecipes.child("favourite").orderByChild(userId).equalTo(true);

Не будет работать, так как вы пропустили ребенка, который является фактическим введенным идентификатором -LY18 ... hFqO.

Я думаю, что вы ищете запрос, который может выглядеть так:

databaseRecipes.child($uid).child("favourite").orderByChild(userId).equalTo(true);

Но, к сожалению, в Firebase нет подстановочных знаков.Таким образом, вы не можете фильтровать элементы на основе свойства, существующего на карте.На самом деле это возможно в Cloud Firestore, но, учитывая ваш вариант использования, вы должны рассмотреть возможность расширения структуры данных, чтобы разрешить обратный поиск, создав еще один узел с именем favoriteUsers, в который вы должны добавить всех избранных пользователей recipes.Эта практика называется denormalization и является обычной практикой, когда дело доходит до Firebase.Если вы новичок в базах данных NoQSL, я рекомендую вам посмотреть это видео, Нормальная нормализация с базой данных Firebase для лучшего понимания.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...