База данных Firebase Realtime - хранение нескольких узлов из пользовательских данных - PullRequest
0 голосов
/ 19 апреля 2020

Я новичок в Firebase и android studio, и я пытаюсь получить несколько узлов для сохранения в Firebase, у меня есть узел для сохранения для «пользователей», но мне нужен еще один для «бюджетов» категория для сохранения. Первоначально я думал, что есть проблема с моим OnClickListener, но при проверке он работает нормально. Это код для отправки пользовательских данных при моей регистрации:

 private void sendUserData(){
        String UserID = firebaseAuth.getUid();
        RegDB regDB = new RegDB(emailDb, nameDb, passwordDb);
        mDatabase.child("Users").child(UserID).setValue(regDB);
    }

А это код для моей пользовательской страницы для отправки пользовательских данных:

 private void sendUserData() {
        String UserID = firebaseAuth.getUid();
        CategoriesDB catDb = new CategoriesDB(travel_budget, entertainment_budget, fitness_budget, beauty_budget, clothes_budget, holiday_budget, food_budget, mobile_budget);
        mDatabase.child("Users").child(UserID).child("Categories").setValue(catDb);
    }

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

java.lang.NullPointerException: Can't pass null for argument 'pathString' in child()

Для справки, это мой OnClickListener для моя страница регистрации:

button_Upload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (validate()) {
                    String emailDb = email.getText().toString().trim();
                    String passwordDb = password.getText().toString().trim();

                    firebaseAuth.createUserWithEmailAndPassword(emailDb, passwordDb).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if (task.isSuccessful()) {
                                sendUserData();
                                firebaseAuth.signOut();
                                Toast.makeText(Register.this, "Successfully Registered!", Toast.LENGTH_SHORT).show();
                                finish();
                                startActivity(new Intent(Register.this, Menu.class));
                            } else {
                                Toast.makeText(Register.this, "Registration Failed.", Toast.LENGTH_SHORT).show();
                            }
                        }
                    });

Также OnClickListener для моей страницы бюджетов:

btn_subCat.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(validate()){
                sendUserData();
                Toast.makeText(Categories.this, "Completed!", Toast.LENGTH_LONG).show();
                finish();
                startActivity(new Intent(Categories.this, Menu.class ));
            }else{
                Toast.makeText(Categories.this, "Submission failed", Toast.LENGTH_LONG).show();
            }
        }

    });

1 Ответ

0 голосов
/ 19 апреля 2020

Я не очень опытный, но я считаю, что у меня возникла похожая проблема при попытке получить и обновить информацию из API. Я думаю, что ваша проблема связана с многопоточностью. Когда вы вызываете функцию getUid (), она создает новый поток для получения необходимой информации. Этот шаг требует некоторого времени, чтобы завершить свою задачу и получить идентификатор из базы данных. Однако вашей функции sendUserData () требуется меньше времени для выполнения своей задачи. Таким образом, вы попадаете на третью строку кода из функции sendUserData (), где вы используете переменную UserID до завершения потока, оставляя вас с нулевой переменной.

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

Для второго подхода вы можете просто создать свою переменную UserID в начале запроса. метод onCreate () и назначьте его значение там. Сделав это, вы создадите поток при создании действия, возьмете информацию из базы данных и закроете поток. Когда вы попытаетесь вызвать функцию sendUserData (), у вас уже будет готов идентификатор пользователя.

Итак, не уверен, что это так, но попробуйте:)

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