Как получить значение нажимной клавиши и обновить дочерние значения значения ключа - PullRequest
0 голосов
/ 11 января 2019

enter image description here Привет всем

Я использую метод push для добавления данных в мою базу данных Firebase в реальном времени. Теперь я хотел бы получить sellername и обновить новый sellername из приложения, а также сохранить изменения в базе данных Firebase.

Как я могу это сделать?

Я использую приведенный ниже код, но каждый раз получаю разные значения ключа случайным образом вместо -LVmsTmBZ_kCdcXlZh7e.

    FirebaseDatabase mFirebaseDatabase = FirebaseDatabase.getInstance();
   DatabaseReference ref =          mFirebaseDatabase.getReference().child("books").child("Classical Mechanics");

String key = ref.push().getKey();

          Toast.makeText(book_details.this, key, Toast.LENGTH_SHORT).show();

Тогда я использую:

                  FirebaseDatabase.getInstance().getReference()
.child("books")
.child(Classical Mechanics)
.child(key)
.child("sellername")
.setValue("newvalue");

И это дает мне нулевую ошибку, которая является ожидаемым результатом, поскольку я получаю случайное значение ключа вместо единственной константы.

1 Ответ

0 голосов
/ 11 января 2019

Я использую приведенный ниже код, но каждый раз получаю разные значения ключа случайным образом вместо -LVmsTmBZ_kCdcXlZh7e.

Это происходит потому, что каждый раз, когда вы используете метод push(), генерируется новый идентификатор.

Так что, если вы хотите получить доступ к определенным объектам, вы должны знать что-то, что уникально идентифицирует эти объекты. В этом случае, если вы хотите изменить значение вашего свойства sellername, вы должны использовать запрос, который выглядит следующим образом:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference classicalMechanicsRef = rootRef.child("books").child("Classical Mechanics");
Query query = classicalMechanicsRef.orderByChild("sellername").equalTo("sagar");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            ds.child("sellername").getRef().setValue("newvalue");
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
query.addListenerForSingleValueEvent(valueEventListener);

Используя этот код, вы измените имя продавца во всех объектах, что имеет смысл, поскольку новое имя должно существовать во всех объектах.

Редактировать: Еще проще обновлять / удалять данные в рамках одного объекта. Для этого, пожалуйста, используйте следующие строки кода:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference classicalMechanicsRef = rootRef.child("books").child("Classical Mechanics").child("-LVmsTmBZ_kCdcXlZh7e");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        dataSnapshot.child("sellername").getRef().setValue("newvalue");
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
classicalMechanicsRef.addListenerForSingleValueEvent(valueEventListener);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...