簡體   English   中英

Firebase 實時 - 如何檢索由 push() 生成的數據?

[英]Firebase Realtime - How do I retrieve data that has been generated by the push()?

我對此還是陌生的。 存儲數據時使用了 push(),但現在無法檢索它,我只能檢索使用 push() 之前第一次存儲的信息。 這是我用來存儲信息的代碼。

regBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        rootnode = FirebaseDatabase.getInstance();
        reference = rootnode.getReference("Users");

        //get all the values
        String firstName = fname.getEditText().getText().toString();
        String lastName = lname.getEditText().getText().toString();
        String idnumber = idnum.getEditText().getText().toString();
        String dateofBirth = dateob.getEditText().getText().toString();
        String email = e_mail.getEditText().getText().toString();
        String phoneNumber = pnum.getEditText().getText().toString();
        String nextofKin = kin.getEditText().getText().toString();
        String nextofKinNumber = nkin.getEditText().getText().toString();``
        String password = pass_word.getEditText().getText().toString();

        if (!validateFirstName() | !validateLastName() | !validateIdNumber() | !validateDateofBirth() | !validateEmaiL() | !validatePhoneNumber() | !validateNextOFKin() | !validateNextOfKinContact() | !validatePassWord()){
            return;
        }
        else {
            Toast.makeText(getApplicationContext(),"registered",Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(MainActivity.this,fbase.class);
            startActivity(intent);
        }

        Userhelperclass helperclass = new Userhelperclass(firstName,lastName,idnumber,dateofBirth,email,phoneNumber,nextofKin,nextofKinNumber,password);
        reference.child(idnumber).push().setValue(helperclass);
    }
});

這是用於檢索信息的代碼。 所以這只會獲取第一次存儲的信息。

private void isUser() {

    String userEnteredIdNumber = idnum.getEditText().getText().toString().trim();
    String userEnteredPassword = pass_word.getEditText().getText().toString().trim();
    String userEnteredFirstName = fname.getEditText().getText().toString().trim();

    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
    Query checkUser = reference.orderByChild("idnumber").equalTo(userEnteredIdNumber);

    checkUser.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull @NotNull DataSnapshot snapshot) {

            if (snapshot.exists()){
                idnum.setError(null);
                idnum.setErrorEnabled(false);

                String passwordFromDb = snapshot.child(userEnteredIdNumber).child("password").getValue(String.class);
                String firstnameFromDb = snapshot.child(userEnteredIdNumber).child("firstName").getValue(String.class);

                idnum.setError(null);
                idnum.setErrorEnabled(false);


                if (passwordFromDb.equals(userEnteredPassword) && firstnameFromDb.equals(userEnteredFirstName)){

                    String lastnamesFromDb = snapshot.child(userEnteredIdNumber).child("lastName").getValue(String.class);
                    String idnumbersFromDb = snapshot.child(userEnteredIdNumber).child("idnumber").getValue(String.class);
                    String birthsFromDb = snapshot.child(userEnteredIdNumber).child("dateofBirth").getValue(String.class);
                    String mailsFromDb = snapshot.child(userEnteredIdNumber).child("email").getValue(String.class);
                    String contactsFromDb = snapshot.child(userEnteredIdNumber).child("phoneNumber").getValue(String.class);
                    String kinsFromDb = snapshot.child(userEnteredIdNumber).child("nextofKin").getValue(String.class);
                    String kinsnumberFromDb = snapshot.child(userEnteredIdNumber).child("nextofKinNumber").getValue(String.class);

                    fname.getEditText().setText(firstnameFromDb);
                    lname.getEditText().setText(lastnamesFromDb);
                    idnum.getEditText().setText(idnumbersFromDb);
                    dateob.getEditText().setText(birthsFromDb);
                    e_mail.getEditText().setText(mailsFromDb);
                    pnum.getEditText().setText(contactsFromDb);
                    kin.getEditText().setText(kinsFromDb);
                    nkin.getEditText().setText(kinsnumberFromDb);
                    pass_word.getEditText().setText(passwordFromDb);

                }
                else if(!passwordFromDb.equals(userEnteredPassword)){

                    pass_word.setError("wrong password");

            }
                else {
                    fname.setError("Wrong name");
                }

            }
            else {
                idnum.setError("No such user exists");
                idnum.requestFocus();
            }
        }


        @Override
        public void onCancelled(@NonNull @NotNull DatabaseError error) {

        }
    });

}

如果我正確閱讀了您的代碼,您將擁有以下數據結構:

Users: {
  $idnumber: {
    $pushkey: {
      idnumber: $idnumber
    }
  }
}

無法像您的代碼嘗試那樣查詢所有用戶的idnumber屬性,因為對實時數據庫的查詢只能包含一級未知鍵,而您有兩個( $idnumber idnumber 和$pushkey )。 另見: Firebase 查詢雙重嵌套

但是由於您也有$idnumber作為Users下的鍵,您可以使用查詢加載該節點,然后使用以下命令遍歷其$pushkey子節點:

DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
Query theUser = reference.child(userEnteredIdNumber);

theUser.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull @NotNull DataSnapshot snapshot) {
        for (DataSnapshot pushSnapshot: snapshot.getChildren()) { // 👈 Loop over push keys
            String passwordFromDb = pushSnapshot.child("password").getValue(String.class);
            ...
         }
    }


    @Override
    public void onCancelled(@NonNull @NotNull DatabaseError error) {
        throw error.toException(); // 👈 Never ignore errors
    }
});

暫無
暫無

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

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