Как использовать строку в дочерней ссылке базы данных Firebase?

Я пытаюсь дать ссылку на базу данных, чтобы загрузить некоторые данные в мою базу данных Firebase в реальном времени. У меня уже есть некоторые данные в базе данных, и я их извлекаю. У меня есть счетчик, в котором пользователь может выбрать конкретного пользователя, которому он хочет отправить сообщение. Итак, я хочу загрузить данные в UID выбранного пользователя.

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

public void onItemSelected(AdapterView<?> adapterView, View view,
                                           int position, long id) {
                    Object item = adapterView.getItemAtPosition(position);
                    NameSelected = item.toString();
                    pris = NameSelected;
                    ref = FirebaseDatabase.getInstance().getReference().child("Faculty_Database");
                    ref.orderByChild("Name").equalTo(pris).addValueEventListener(new ValueEventListener(){
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            for(DataSnapshot datas: dataSnapshot.getChildren()){
                                key = datas.child("UID").getValue(String.class);
                            }
                        }
//

SubmitButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (NameEditText.getText().toString().equals("") || PhoneNumberEditText.getText().toString().equals("") || CompanyEditText.getText().toString().equals("") || EmailEditText.getText().toString().equals("") || AppointmentEditText.getText().toString().equals("") || image.equals(null)) {
                Toast.makeText(getApplicationContext(), "Please fill all details", Toast.LENGTH_LONG).show();
            } else {
                final StudentDetails studentDetails = new StudentDetails();
                GetDataFromEditText();
                studentDetails.setName(NameHolder);
                studentDetails.setPhoneNumber(NumberHolder);
                studentDetails.setemail(EmailHolder);
                studentDetails.setCompanyName(CompanyHolder);
                studentDetails.setAppointment(AppointmentHolder);
                studentDetails.setNameSelected(NameSelected);

                // Getting the ID from firebase database.
                final String StudentRecordIDFromServer = databaseReference.push().getKey();

                filePath = FirebaseStorage.getInstance().getReference().child("Visitors");
                ByteArrayOutputStream baos =  new ByteArrayOutputStream();
                image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
                byte[] dataToUpload = baos.toByteArray();
                UploadTask uploadTask = filePath.putBytes(dataToUpload);

                Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
                    @Override
                    public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
                        if (!task.isSuccessful()) {
                            throw task.getException();
                        }

                        // Continue with the task to get the download URL
                        return filePath.getDownloadUrl();
                    }
                }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                    @Override
                    public void onComplete(@NonNull Task<Uri> task) {
                        if (task.isSuccessful()) {
                            downloadUri= task.getResult();
                                databaseReference = FirebaseDatabase.getInstance().getReference().child("Faculty_Database").child(key).child("Received");
                                Map<String, Object> mapToUpload = new HashMap<>();
                                mapToUpload.put("imageUrl", downloadUri.toString());
                                mapToUpload.put("Data", studentDetails);
                                databaseReference.child(StudentRecordIDFromServer).setValue(mapToUpload);
                        } else {
                            // Handle failures
                            // ...
                        }
                    }
                });
            }
            // Showing Toast message after successfully data submit.
            Toast.makeText(SecurityActivity.this, "Request Sent Successfully!", Toast.LENGTH_LONG).show();
        }
    });

Это моя база данных

Как использовать строку в дочерней ссылке базы данных Firebase?

Пожалуйста, дайте мне знать, как я могу создать дочерний элемент с именем «Получено» под выбранным UID пользователя для загрузки моих данных?

Я пытался добиться того же в одном из моих проектов, ваш подход несколько прав при создании дочерней ссылки. В моем подходе я сделал слишком дочернюю ссылку, но вместо того, чтобы позволить firebase создавать ключ по умолчанию сам по себе, я сделал ключ как UID, и позже я смог получать данные, используя этот UID. Поэтому я бы предложил вместо того, чтобы создавать новый ключ как «UID», сделать ключ firebase itlsef как UID

shikhar 29.05.2019 07:57

Да, здесь сам ключ Firebase является UID. Я создаю пользователя с UID, предоставленным Firebase при аутентификации. Я просто загружаю один и тот же UID Firebase в дочерний UID каждого пользователя и получаю UID выбранного пользователя и сохраняю его в «ключе».

Vignesh N H 29.05.2019 08:06

не могли бы вы показать ошибку, которую вы получаете

shikhar 29.05.2019 08:34

Мое приложение просто вылетает.

Vignesh N H 29.05.2019 08:44
0
4
1 034
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

 ref.orderByChild("Name").equalTo(pris).addValueEventListener(new ValueEventListener(){
    @Override
 public void onDataChange(DataSnapshot dataSnapshot) {
    for(DataSnapshot datas: dataSnapshot.getChildren()){

       key = datas.child("UID").getValue(String.class);
      databaseReference = FirebaseDatabase.getInstance().getReference().child("Faculty_Database").child(key).child("Received");
      Map<String, Object> mapToUpload = new HashMap<>();
      mapToUpload.put("imageUrl", downloadUri.toString());
      mapToUpload.put("Data", studentDetails);
      databaseReference.child(StudentRecordIDFromServer).setValue(mapToUpload);
          }
    }

Готово, загружено.

Vignesh N H 29.05.2019 08:14

Мое приложение вылетает, как только я открываю это действие

Vignesh N H 29.05.2019 08:44

Причина: java.lang.NullPointerException: невозможно передать значение null для аргумента pathString в child() на com.google.firebase.database.DatabaseReference.child(com.goo‌​gle.firebase:firebas‌​e-database@ @ 17.0.0:1‌​01) Да, я получаю ноль. Не могли бы вы помочь мне с этим? :/

Vignesh N H 29.05.2019 09:51

вы добавили код внутри цикла for внутри onDataChange как в ответе

Peter Haddad 29.05.2019 10:00

java.lang.NullPointerException: попытка вызвать виртуальный метод java.lang.String android.net.Uri.toString() для нулевой ссылки на объект в com.example.vms.SecurityActivity$1$1$1.onDataChange(Security‌​Activity. java:108) на com.google.firebase.database.core.ValueEventRegistration.fir‌​eEvent(com.google.fi‌​rebase:firebase-data‌​base@@17.0.0:75) на com.google.firebase.database .core.view.DataEvent.fire(com.go‌​ogle.firebase:fireba‌​se-database@@17.0.0:‌​63) Я получаю эту ошибку, если пытаюсь использовать ваш метод:/

Vignesh N H 29.05.2019 10:27

удали это mapToUpload.put("imageUrl", downloadUri.toString());

Peter Haddad 29.05.2019 10:32

Извините, я этого не заметил, я удалил его, но, похоже, он все еще не решает проблему:/ java.lang.NullPointerException: невозможно передать значение null для аргумента 'pathString' в child() на com.google.firebase. database.DatabaseReference.child(com.goo‌​gle.firebase:firebas‌​e-database@@17.0.0:1‌​01) Теперь я получаю эту ошибку.

Vignesh N H 29.05.2019 11:09

изменить это databaseReference.child(StudentRecordIDFromServer).setValue(‌​mapToUpload); на это databaseReference.child("id").setValue(mapToUpload);

Peter Haddad 29.05.2019 11:12

Эй, я понял. Я помещаю Map<String, Object> mapToUpload = new HashMap<>(); mapToUpload.put("imageUrl", downloadUri.toString()); mapToUpload.put("Данные", studentDetails); внутри метода OnDataChange, но не вызывал там setValue. Я вызвал базу данныхReference.child(StudentRecordIDFromServer).setValue(‌​mapToUpload); внутри onCompleteListener SubmitButton, и это сработало. Большое спасибо :)

Vignesh N H 29.05.2019 11:44

Другие вопросы по теме