Этот код:
databaseReference = FirebaseDatabase.getInstance().getReference("Cars").child(userId);
key = databaseReference.getKey();
Это очень запутанный способ сказать:
key = userId;
Поэтому, когда вы делаете databaseReference.child(key)....setValue(...)
, вы создаете нового ребенка с помощью userId
под существующим userId
.
Если вы хотите обновить существующий автомобиль под узлом идентификатора пользователя, вы уже знаете ключ дочернего узла:
databaseReference.child("-M5vP3HXN5UINkvZFJ0q").child("carMake").setValue(make.getText().toString())
Если вы не знаете ключ, вам сначала нужно прочитать данные, чтобы определить дочерний ключ (и):
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot carSnapshot: dataSnapshot.getChildren()) {
carSnapshot.getRef()..child("carMake").setValue(make.getText().toString());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
}
for
l oop здесь необходимо, потому что у вас может быть несколько дочерних узлов под узлом идентификатора пользователя. Если вы не хотите иметь несколько дочерних узлов, не вызывайте push()
при добавлении данных автомобиля.
Если вы знаете уникальное значение свойства дочернего узла для обновления , вы можете использовать запрос, чтобы выбрать только эти узлы:
databaseReference
.orderByChild("carMake")
.equalTo("renouot")
.addListenerForSingleValueEvent(new ValueEventListener() {
...
Имейте в виду, что он все равно может совпадать с несколькими дочерними узлами, поэтому for
l oop необходим, как и раньше.
Последнее замечание: теперь вы звоните setValue()
три раза, чтобы установить данные для автомобиля. Хотя это может дать вам правильный результат, оно, скорее всего, создаст проблемы в будущем. Для всего обновления лучше всего выполнить одну операцию записи:
HashMap<String,Object> values = new HashMap<>();
values.put("carMake", make.getText().toString());
values.put("carType", type.getText().toString());
values.put("carYear", year.getText().toString());
databaseReference.setValue(values);