Я борюсь с проектом, который я хочу продолжать развивать, который я нашел на GitHub. Это просто для самообразования, потому что я хочу более эффективно работать с firebase. Вот проект ...

0
Zimooon 10 Апр 2021 в 00:58

2 ответа

Лучший ответ

Каждый раз, когда вы вызываете push() в базе данных Firebase Realtime, он генерирует новое уникальное местоположение и ключ. Итак, эта строка генерирует новый ключ:

String id = databaseReference.push().getKey();

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

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference(Constants.USER_SCORE);
Query query = databaseReference.orderByChild("userName").equalTo("Peter")
query.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot resultsSnapshot) {
    for (DataSnapshot userSnapshot: resultsSnapshot.getChildren()) {
      User user = new User(id, getSharedPreferences(Constants.USER_PREFERENCE, Context.MODE_PRIVATE).getString(Constants.USER_NICK, getString(R.string.OK)),
        numberOfLetters / 5, numberOfLetters, true);
      userSnapshot.getReference().setValue(user);
    }
  }

  @Override
  public void onCancelled(DatabaseError databaseError) {
    throw databaseError.toException();
  }
}

Вы заметите выше, что я сказал «узел (ы)», поскольку может быть несколько дочерних узлов, где userName равно Peter. Если вы хотите предотвратить такую ​​ситуацию, вы можете рассмотреть возможность использования имени пользователя в качестве идентификатора для узлов. Если оценка Питера хранится в /score-list/Peter, всегда может быть только одна оценка, поскольку путь каждого узла гарантированно уникален.

0
Frank van Puffelen 9 Апр 2021 в 22:56

Каждый раз, когда вы используете push, он генерирует новый уникальный ключ. Поэтому, если вы хотите обновить значения на основе userName, вы можете сделать это следующим образом:

String userName = getSharedPreferences(Constants.USER_PREFERENCE, Context.MODE_PRIVATE).getString(Constants.USER_NICK, getString(R.string.OK))

User user = new User(userName, numberOfLetters / 5, numberOfLetters, true);
databaseReference.child(userName).setValue(user);
0
Amirmohammad Asadpour 10 Апр 2021 в 01:05