#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. Пожалуйста, используйте
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 обычно предназначены для чтения и прослушивания изменений данных, а не для записи, что может быть проблемой вашего кода