Как добавить данные в уже существующий документ путем поиска указанного узла c в Firebase? (Android) - PullRequest
0 голосов
/ 03 апреля 2020

Существует один документ, который представляет собой профиль студента с данными студента, такими как курс, имя пользователя, статус и т. Д. c. Я хочу добавить еще один узел с именем uid в существующий документ путем поиска emailid

Например, в документе, содержащем emailid: "abc@gmail.com", я хочу добавить uid: "111032" в этот документ, содержащий emailid .

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        final DatabaseReference studentRef = rootRef.child("STUDENT");

        lg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                username = un.getText().toString().trim();
                String password= pw.getText().toString().trim();
                lg.setText("Logging in...");
                firebaseAuth.signInWithEmailAndPassword(username, password)
                        .addOnCompleteListener(Welcome.this, new OnCompleteListener<AuthResult>() {
                            @Override
                            public void onComplete(@NonNull Task<AuthResult> task) {
                                if (task.isSuccessful()) {
                                    firebaseAuth = FirebaseAuth.getInstance();
                                    final String current_user_id = firebaseAuth.getCurrentUser().getUid();
                                    //Save UID to database
                                    Query emailAddressQuery = studentRef.orderByChild("emailid").equalTo(username).limitToFirst(1);
                                    ValueEventListener valueEventListener = new ValueEventListener() {
                                        @Override
                                        public void onDataChange(DataSnapshot dataSnapshot) {
                                            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                                                Map<String, Object> uidUpdate = new HashMap<String, Object>();
                                                uidUpdate.put("uid", current_user_id);
                                                ds.getRef().updateChildren(uidUpdate);
                                            }
                                        }

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

                                        }
                                    };
                                    emailAddressQuery.addListenerForSingleValueEvent(valueEventListener);
                                    Intent i=new Intent(Welcome.this,Home.class);
                                   // i.putExtra("useremail", username);
                                    startActivity(i);
                                    lg.setText("Log In");
                                } else {
                                    Toast.makeText(getApplicationContext(), "Log In Failed", Toast.LENGTH_SHORT).show();
                                    lg.setText("Log in");
                                }

                                // ...
                            }
                        });
            }
        });

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

Как показано на этом изображении , я хочу выполнить поиск по emailid (показан желтым цветом) и добавить узел с именем uid в этот указанный c документ.

СТАРЫЙ КОД:

username = un.getText().toString().trim();
firebaseAuth = FirebaseAuth.getInstance();
String current_user_id = firebaseAuth.getCurrentUser().getUid();
ref= FirebaseDatabase.getInstance().getReference().child("STUDENT").child(username);
                                    Map<String, Object> updates = new HashMap<String, Object>();
                                    updates.put("uid", current_user_id);
                                    ref.updateChildren(updates);

Этот код работает, но мы должны передать имя документа, пока я хочу передать данные по дочернему узлу в документе.

1 Ответ

2 голосов
/ 03 апреля 2020

Чтобы решить эту проблему, используйте следующие строки кода:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference studentRef = rootRef.child("STUDENT");
Query emailAddressQuery = studentRef.orderByChild("emailid").equalTo("abc@gmail.com").limitToFirst(1);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            Map<String, Object> uidUpdate = new HashMap<String, Object>();
            uidUpdate.put("uid", uid);
            ds.getRef().updateChildren(uidUpdate).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        Log.d("TAG", "task is successful!");
                    } else {
                        Log.d("TAG", task.getException().getMessage());
                    }
                }
            });
        }
    }

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

Результатом этой операции будет обновление uid в пользовательском объекте.

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