# #java #android #firebase #android-studio #firebase-realtime-database
Вопрос:
Я создаю простое приложение, используя Android studio и базу данных firebase в реальном времени. Когда пользователь зарегистрирует свои данные, они будут сохранены под Uid, который предоставляет firebase. Затем я создал еще один узел внутри Uid под названием «ПУТЬ», и я хочу сохранить некоторые данные, которые пользователь предоставляет внутри него. Для этого я хочу создать определенный идентификатор или что-то в этом роде, чтобы он не заменялся каждый раз, когда пользователь вводит новые данные. (Проверьте скриншот)
Я попытался сделать это с помощью Datasnapshot, но он не реагирует на щелчок. Это то, что я пробовал.
add_new.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if( !Validate_text() ){
return;
}
else{
//Toast.makeText(getApplicationContext(), picker.getDayOfMonth() "-" picker.getMonth() "-" picker.getYear(), Toast.LENGTH_SHORT).show();
// redirect to path
String ach = milestone.getEditText().getText().toString().trim();
int day = picker.getDayOfMonth();
int month = picker.getMonth();
int year = picker.getYear();
String date = day "/" month "/" year ;
reference.child(uid).child("PATH").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for( DataSnapshot random_key : snapshot.getChildren()) {
String key = random_key.getKey();
Map<String, Object> updates = new HashMap<String, Object>();
updates.put("Achievement : ", ach);
updates.put("Date", date);
reference.child(uid).child("PATH").child(key).updateChildren(updates).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void unused) {
Toast.makeText(getApplicationContext(), "Your achievement has been updated.", Toast.LENGTH_LONG).show();
finish();
startActivity(new Intent(AddPath.this, Path.class));
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Log.v(TAG, error.getMessage());
}
});
}
}
});
Если у кого-нибудь есть идеи, что я здесь сделал не так, или кто может помочь, пожалуйста.
Ответ №1:
Я бы предпочел, чтобы вы построили свою базу данных json примерно так.
-users
-userUid
-name: "Ticherhaz"
-others: "Master"
-userUid2
-name: "Pyke"
-others: "Bronze"
-path
-userUid
-pathUid
-achievement: "Eat without using hand"
-date: "12/02/2022"
-pathUid2
-achievement: "Wake up early"
-date: "12/02/2022"
-userUid2
-pathUid3
-achievement: "Feeding team"
-date: "13/02/2022"
Поскольку вы говорите, что хотите создать случайный Uid, вы можете использовать Firebase pushId
. Вы можете обратиться сюда, Push-идентификатор Firebase.
add_new.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if( !Validate_text() ){
return;
}
else{
String ach = milestone.getEditText().getText().toString().trim();
int day = picker.getDayOfMonth();
int month = picker.getMonth();
int year = picker.getYear();
String date = day "/" month "/" year ;
Map<String, Object> updates = new HashMap<String, Object>();
updates.put("Achievement : ", ach);
updates.put("Date", date);
final String pushId = FirebaseDatabase.getInstance().getReference().push().getKey(); //Create new random Id
FirebaseDatabase.getInstance().getReference().child("path").child(uid).child(pushId).setValue(updates).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Toast.makeText(getApplicationContext(), "Your achievement has been updated.", Toast.LENGTH_LONG).show();
finish();
startActivity(new Intent(AddPath.this, Path.class));
}
});
}
}
});
Комментарии:
1. Большое вам спасибо @TicherhazFreePalastine . Ваше решение сработало. Я также изменил структуру, как вы упомянули. Еще раз спасибо..