Изменение значений в базе данных в реальном времени Android Studio Java

#android #firebase-realtime-database

#Android #firebase-база данных в реальном времени

Вопрос:

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

 saveEditProfile_studentbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
                String studentUser = firebaseAuth.getCurrentUser().getUid();

                final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Users").child(studentUser);
                Toast.makeText(StudentProfileEditAct.this, studentUser, Toast.LENGTH_SHORT).show();
                databaseReference.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        String replaceName = studentChangeFullName.getText().toString().trim();
                        String replacePhoneNumber = studentChangePhoneNum.getText().toString().trim();
                        Map<String, Object> updates = new HashMap<>();
                        updates.put("fullName", replaceName);
                        updates.put("phoneNumber", replacePhoneNumber);

                        databaseReference.updateChildren(updates);
                        Toast.makeText(StudentProfileEditAct.this, "Changes has been made", Toast.LENGTH_SHORT).show();
                    }

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

                    }
                });

            }
        });
 

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

[1]: https://i.stack.imgur.com/wdn4S.png

введите описание изображения здесь
введите описание изображения здесь

Изображения ниже, когда я попытался обновить во второй раз, не закрывая приложение первым.

Комментарии:

1. Пожалуйста, используйте android-studio тег только для вопросов о самой IDE Android Studio. Для вопросов о программировании Android в целом используйте android тег.

Ответ №1:

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

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

 public void onClick(View v) {
    FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
    String studentUser = firebaseAuth.getCurrentUser().getUid();

    final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Users").child(studentUser);
    String replaceName = studentChangeFullName.getText().toString().trim();
    String replacePhoneNumber = studentChangePhoneNum.getText().toString().trim();
    Map<String, Object> updates = new HashMap<>();
    updates.put("fullName", replaceName);
    updates.put("phoneNumber", replacePhoneNumber);

    databaseReference.updateChildren(updates);
    Toast.makeText(StudentProfileEditAct.this, "Changes has been made", Toast.LENGTH_SHORT).show();
}
 

Ответ №2:

Одним из быстрых решений является использование свойства .setValue в ссылке на базу данных.

Вы можете использовать класс модели, если вы намереваетесь изменить разные поля одновременно.

Основываясь на документации firebase, valueeventlisteners обычно предназначены для чтения и прослушивания изменений данных, а не для записи, что может быть проблемой вашего кода