簡體   English   中英

如何從 Firebase 獲取有關特定用戶的數據

[英]How to get data about a specific user from Firebase

有一個 Firebase 實時數據庫,我在注冊期間將一些數據導入其中,它們屬於來自 Auth 的 UID 鍵下的用戶部分:

public void writeUserToDB(Object data, String currentUser){
    DatabaseReference myRef = mDataBase.child("Users/" + currentUser);
    myRef.setValue(data);
}


mRegisterBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        
        String id = mDataBase.getKey();
        String name = mName.getText().toString().trim();
        String email = mEmail.getText().toString().trim();
        String password = mPassword.getText().toString().trim();
        String userBinder = mUserBinder.getText().toString().trim();

        
        if (TextUtils.isEmpty(email)) {
            mEmail.setError("Write your email...");
            return;
        }
        if (TextUtils.isEmpty(password)) {
            mEmail.setError("Write your password...");
            return;
        }
        if (TextUtils.isEmpty(name)) {
            mName.setError("Write your name...");
            return;
        }
        if (password.length() < 8) {
            mPassword.setError("Password must have 8+ symbols.");
            return;
        }

        
        fAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override

            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    User newUser = new User(currentUser, id, name, email, password, userBinder);

                    
                    currentUser = FirebaseAuth.getInstance().getCurrentUser().getUid();
                    writeUserToDB(newUser, currentUser);

                    Toast.makeText(Register.this, "Пользователь зарегистрирован.", Toast.LENGTH_LONG).show();
                    startActivity(new Intent(getApplicationContext(), MainActivity.class));

                } else {
                    Toast.makeText(Register.this, "Произошла ошибка. Повторите." +
                            task.getException().getMessage(), Toast.LENGTH_LONG).show();
                }
            }
        });
    }
});

在firebase中它看起來像:

Users:
  UID: {
    email
    name
    password
    userbinder
  }

我需要在 MainActivity 中將這些數據作為字符串變量獲取,以便在單擊另一個按鈕時使用。 UPD - 這就是我試圖做的,但它不起作用並執行不同的功能。

String uid = FirebaseAuth.getInstance().getUid();
        mDataBase = FirebaseDatabase.getInstance().getReference();
        DatabaseReference uidRef = mDataBase.child("Users/").child(uid);
        ValueEventListener valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot ds : dataSnapshot.getChildren()) {
                    String email = ds.child("email").getValue(String.class);
                    String userBinder = ds.child("userBinder").getValue(String.class);
                    Log.d("TAG", email + "/" + userBinder);
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
            }
        };
        uidRef.addListenerForSingleValueEvent(valueEventListener);

我需要在 MainActivity 按鈕中使用這些數據:

mSosButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                DatabaseReference databaseReference = FirebaseDatabase.getInstance()
                        .getReference().child("Sos");
                Toast.makeText(MainActivity.this, "Message sended!", Toast.LENGTH_LONG).show();

                Sos sos = new Sos(user_email, binded_user_email);
                databaseReference.push().setValue(sos);
            }
        });

為了能夠獲取登錄用戶的數據,您必須附加一個完全指向Users節點的偵聽器。 所以請使用以下代碼行:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference db = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = db.child("Users").child(uid);
uidRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            DataSnapshot snapshot = task.getResult();
            String email = snapshot.child("email").getValue(String.class);
            String userBinder = snapshot.child("userBinder").getValue(String.class);
            Log.d("TAG", email + "/" + userBinder);
        } else {
            Log.d("TAG", task.getException().getMessage()); //Never ignore potential errors!
        }
    }
});

請注意,不需要循環遍歷結果。 您只需要獲取與這兩個字段對應的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM