Как обновить значения в приложении для Android с помощью Firebase? - PullRequest
1 голос
/ 13 апреля 2019

Привет Пожалуйста, найдите структуру базы данных Firebase?

enter image description here

Теперь, скажем, мы хотим обновить fName и lName из -LcKJ14wv-Y46QER1V- 0

Как обновить их, чтобы обновлялись только эти значения и новые значения не добавлялись в базе данных?

Код, который мы написали

queryToGetData = FirebaseDatabase.getInstance().getReference().child(AppData.STUDENTS)
                    .orderByChild("studentUnique").equalTo(user.getUid()).limitToFirst(1);
            queryToGetData.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    if(!dataSnapshot.exists()){
                        db.push().setValue(ss);
                        Common.alertDialog("Added","Profile Details saved", StudentProfile.this);
                    } else {
                        db.setValue(ss);
                        Common.alertDialog("Oops","Profile Updated", StudentProfile.this);
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                    Common.alertDialog("Oops","Something went wrong!", StudentProfile.this);
                }
            });

Что делает этот фрагмент кода?

когдазапуск обновления в первый раз (вся коллекция пуста)

enter image description here

* при запуске обновления во второй раз (тот же пользователь)

enter image description here

при запуске обновления в третий раз (тот же пользователь)

enter image description here

Ответы [ 3 ]

1 голос
/ 13 апреля 2019

Во-первых, я бы предложил реструктурировать вашу БД следующим образом для более простого запроса.

students
    QslkALDJFLDFLFk(this is the student unique key or the uid)
        emailAddress:
        fName:

Затем используйте updateChildren() для обновления определенных полей.

Student student = new Student("firstName", "lastName");
Map<String, Object> values = student.toMap();

queryToGetData = FirebaseDatabase.getInstance().getReference()
    .child(AppData.STUDENTS).child(user.getUid())
    .updateChildren(values);

С документацией можно ознакомиться здесь

0 голосов
/ 13 апреля 2019

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

queryToGetData = FirebaseDatabase.getInstance().getReference().child(AppData.STUDENTS)
                .orderByChild("studentUnique").equalTo(user.getUid());
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            Map<String, Object> map = new HashMap<>();
            map.put("fName", "newFirstName");
            map.put("lName", "newLastName");
            ds.getRef().updateChildren(map);
        }
    }

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

Смотрите, я удалил .limitToFirst(1), потому что uid изпользователь уникален.Поэтому, даже если мы удалим этот вызов метода, вы все равно получите один результат.

0 голосов
/ 13 апреля 2019

Я делаю так; -

DatabaseReference receiverUserRef = FirebaseDatabase.getInstance().getReference(chatListTableName)
                .child(userId)
                .child(firebaseUser.getUid());

        receiverUserRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    receiverUserRef.child("time").setValue(String.valueOf(System.currentTimeMillis()));
                } else {
                    receiverUserRef.child("id").setValue(firebaseUser.getUid());
                    receiverUserRef.child("isGroup").setValue("false");
                    receiverUserRef.child("time").setValue(String.valueOf(System.currentTimeMillis()));
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...