Как избежать проблемы перезаписи дочернего значения базы данных firebase?

#java #android-studio #firebase-realtime-database

# #java #android-studio #firebase-realtime-database

Вопрос:

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

 String name = CName.getText().toString().trim();
DatabaseReference mDbRef = mDatabase.getReference().child("Contacts").child(name);
mDbRef.child("cname").setValue(dCName);
mDbRef.child("pcontact").setValue(dPContact);
mDbRef.child("pdesig").setValue(dPDesig);
mDbRef.child("pemail").setValue(dPEmail);
mDbRef.child("pmobile").setValue(dPMobile);
 

Цель — сохранить контактные данные. Название компании записывается в «имя» и добавляется «Контакты» в качестве дочернего элемента. Но всякий раз, когда я пытаюсь добавить нового пользователя с тем же названием компании, он перезаписывает предыдущую запись новой.

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

Ответ №1:

Самый простой способ использовать push() для создания нового уникального местоположения для пользователя.

 String name = CName.getText().toString().trim();
DatabaseReference mDbRef = mDatabase.getReference().child("Contacts").child(name).push();
mDbRef.child("cname").setValue(dCName);
mDbRef.child("pcontact").setValue(dPContact);
mDbRef.child("pdesig").setValue(dPDesig);
mDbRef.child("pemail").setValue(dPEmail);
mDbRef.child("pmobile").setValue(dPMobile);
 

Не связанный, я рекомендую объединить все значения в map и вызывать setValue только один раз:

 String name = CName.getText().toString().trim();
DatabaseReference mDbRef = mDatabase.getReference().child("Contacts").child(name).push();
Map<String, Object> values = new HashMap<>();

values.put("cname", dCName);
values.put("pcontact", dPContact);
values.put("pdesig", dPDesig);
values.put("pemail", dPEmail);
values.put("pmobile", dPMobile);

mDbRef.setValue(values);
 

Выполнение только одной операции записи более эффективно, но также упростит защиту базы данных в дальнейшем.

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

1. Спасибо за ответ. Это работает так, как я хочу. Поскольку я новичок в программировании, мне нужно узнать больше, чтобы писать код более эффективным способом. Теперь возникла проблема с возвратом значения в адаптере firebase recycler. Моя ссылка на базу mDatabase = FirebaseDatabase.getInstance().getReference().child("Contacts") данных заключалась в том, что теперь она не выбирает значение, поскольку оно переходит к дочернему «имени», которое меняется. Не могли бы вы сказать мне, как обратиться к возврату значения, чтобы показать его в моем адаптере? Код адаптера приведен ниже

2. FirebaseRecyclerOptions<project> options = new FirebaseRecyclerOptions.Builder<project>().setQuery(mDatabase, project.class).build(); FBRA = new FirebaseRecyclerAdapter<project, ProjViewHolder>(options) { protected void onBindViewHolder(@NonNull ProjViewHolder holder, int position, @NonNull project model) { holder.cpname.setText(model.getCname()); holder.ccname.setText(model.getPcontact();