Не удалось проверить дочерний Firebase (null PathString) - PullRequest
0 голосов
/ 09 октября 2018

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

Это мой код

mUserRef = FirebaseDatabase.getInstance().getReference().child("Users").child(mCurrentUserId);
mUserRef.keepSynced(true);
mUserRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot)
    {
        selected_group = dataSnapshot.child("group").getValue().toString();
        String position = dataSnapshot.child("position").getValue().toString();

        if (position.equals("head of toddlers"))
        {
            my_group = "Toddlers";

        }
        else if (position.equals("head of juniors"))

        {
            my_group = "Juniors";

        }
         else if (position.equals("head of seniors"))
        {
            my_group = "Seniors";
        }
        else if (position.equals("head of ambassadors"))

        {
            my_group = "Ambassadors";
        }




    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});


    rcvListMessage = (RecyclerView) findViewById(R.id.announcements_list);

    mDatabase = FirebaseDatabase.getInstance().getReference();
    mMessageReference = FirebaseDatabase.getInstance().getReference("Requests").child(my_group);  // <--- this is where i'm getting the error

Это мой журнал cat

java.lang.NullPointerException: Can't pass null for argument 'pathString' in child()
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2695)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2769)
   at android.app.ActivityThread.access$900(ActivityThread.java:177)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1430)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:135)
   at android.app.ActivityThread.main(ActivityThread.java:5910)
   at java.lang.reflect.Method.invoke(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)
Caused by: java.lang.NullPointerException: Can't pass null for argument 'pathString' in child()
   at com.google.firebase.database.DatabaseReference.child(Unknown Source)
   at org.maninresponsibility.www.womaninresponsibility.HodMembers.onCreate(HodMembers.java:113)
   at android.app.Activity.performCreate(Activity.java:6178)
   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2648)

База данных, к которой я обращаюсь, имеет Запросы, а затем дочерняя группа, которая группирует пользователей поих соответствующие группы.Что я должен сделать, чтобы я мог использовать child (my_group) для проверки значений в моей базе данных.Заранее спасибо, PS.за ответы я был бы признателен за объяснение причины ошибки и как я должен подходить к таким случаям для будущих ссылок.

это моя структура базы данных:

Database Structure

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

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

 mMessageReference = FirebaseDatabase.getInstance().getReference().child("Requests").child("Toddlers"); 
    //and then
    mMessageReference..addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    for (DataSnapshot dataSnapshot1:dataSnapshot.getChildren()){
                        String value = dataSnapshot1.child("group").getValue().toString();

                    }
                }

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

                }
            });

И я думаю, что Toddlers - это тоже ребенок, поэтому вам нужно вставить в путь к вашей базе данных,my_group не является ключом в вашей базе данных.ваш ключ group, поэтому он получает нулевую ошибку.На самом деле это не лучший способ извлечения данных, вам нужно создать один класс модели, чтобы его было легко найти.

Read this documentation for more information: 

Как получить данные в базе данных

0 голосов
/ 09 октября 2018

Я думаю, что проблема в mCurrentUserId, так как ошибка, которую вы показали в logcat, говорит, что не может передать null в child().

Если это так, то ваш mCurrentUserId неверно получен.Вы можете попытаться получить его следующим образом:

FirebaseAuth mAuth;
mAuth = FirebaseAuth.getInstance();
mCurrentUserId = mAuth.getCurrentUser().getUid();

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

Редактировать: Св вашей структуре базы данных я не вижу ни одного поля с именем Users.Так что проблема в том, что вы не правильно ссылаетесь на свою базу данных.

Вы должны попробовать заменить свой код следующим кодом:

DatabaseReference mRef = FirebaseDatabase.getInstance().getReference().child("Requests").child("Toddlers").child(mCurrentUserId);

mRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                  String selected_group = dataSnapshot.child("group").getValue().toString();
    String position = dataSnapshot.child("position").getValue().toString();

    if (position.equals("head of toddlers"))
    {
        my_group = "Toddlers";

    }
    else if (position.equals("head of juniors"))

    {
        my_group = "Juniors";

    }
     else if (position.equals("head of seniors"))
    {
        my_group = "Seniors";
    }
    else if (position.equals("head of ambassadors"))

    {
        my_group = "Ambassadors";
    }

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

                }
            });

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

mDatabase = FirebaseDatabase.getInstance().getReference().child("Head of departments").child("head of toddlers");
    mDatabase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            if (dataSnapshot.exists() && dataSnapshot != null)

            {
                mDatabase.child("Requests").addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot)
                    {
                        if (dataSnapshot.exists() && dataSnapshot != null)
                        {
                            mMessageReference = FirebaseDatabase.getInstance().getReference().child("Head of departments").child(my_department).child("Requests");
                        }

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

Я добавил код в точности так, как вы хотите, но я не вижу узла с именем position в изображении вашей базы данных.Итак, я надеюсь, что это присутствует.

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