如何从Firebase检索数据并将其放在文本字段中

时间:2019-05-02 14:29:54

标签: java android

当我尝试从Firebase检索数据时,它在LogCat中表示该值为null。而且我不能将数据放在文本字段中

我的firebase看起来像这样

Firebase database


ive尝试使用所有可能的数据快照进行此操作。但我认为这是因为用户必须先登录。

mAuth = FirebaseAuth.getInstance();
    String gebruiker_id = mAuth.getCurrentUser().getUid();
    String postcode = mAuth.getCurrentUser().getEmail();

    mDatabase = FirebaseDatabase.getInstance().getReference().child("Gebruikers");


    a = (TextView) findViewById(R.id.TestTextViewGeboortedatum);
    b = (TextView) findViewById(R.id.TestTextViewNaam);
    c = (TextView) findViewById(R.id.TestTextviewPostcode);
    d = (TextView) findViewById(R.id.TestTextViewPunten);

    btn = (Button) findViewById(R.id.TestButtonShow);


    mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
           for (DataSnapshot datas : dataSnapshot.getChildren()){
               String keys = datas.child("Postcode").toString();
               c.setText("Postcode :"+keys);
           }

            }


        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

我将数据放入其中的文件是:

public class SignUpActivity extends AppCompatActivity implements View.OnClickListener {
//geeft aan dat dese text ingevuld moet worden.
EditText editTextEmail, editTextPassword, editTextGeboortedatum, editTextNaam, editTextPostcode;
int punten = 0;

FirebaseAuth mAuth;

@Override
//protected void is dat deze void beschermt is en alleen usable is in deze class of een gerelateerde class.
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sign_up);
//geef waardes aan de buttons.
    editTextEmail = findViewById(R.id.editTextEmail);
    editTextPassword = findViewById(R.id.editTextPassword);
    editTextNaam = findViewById(R.id.editTextNaam);
    editTextGeboortedatum = findViewById(R.id.editTextGeboortedatum);
    editTextPostcode = findViewById(R.id.editTextPostcode);
//roept firebase aan
    mAuth = FirebaseAuth.getInstance();
//Zet  de 'knop' op de knop zodat je er op kan klikken. This verwijst naar buttonSignup.
    findViewById(R.id.buttonSignUp).setOnClickListener(this);
    //findViewById(R.id.textViewSignup).setOnClickListener(this);
    findViewById(R.id.textViewLogin).setOnClickListener(this);
}
//private void betekent dat alleen de methodes van deze class toegang hebben tot de members.
private void registerUser() {
    //zorgt ervoor dat je text kan invoeren. met getText weet hij dat er text moet komen to string betekent dat het een string format moet zijn en trim elimineert de spaties aan het begin of eind.
    String email = editTextEmail.getText().toString().trim();
    String password = editTextPassword.getText().toString().trim();

    if (email.isEmpty()) {
        editTextEmail.setError("Email is required");
        //requestfocus zorgt er voor dat er bij elke input wordt geluisterd bij de respective listener component. in dit geval editTextMail.
        editTextEmail.requestFocus();
        return;
    }

    if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
        editTextEmail.setError("Wrong Email");
        //requestfocus zorgt er voor dat er bij elke input wordt geluistert bij de respective listener component. in dit geval editTextMail.
        editTextEmail.requestFocus();
        return;
    }

    if (password.isEmpty()) {
        editTextPassword.setError("Password is required");
        //requestfocus zorgt er voor dat er bij elke input wordt geluisterd bij de respective listener component. in dit geval editTextPassword.
        editTextPassword.requestFocus();
        return;
    }
    if (password.length() < 6) {
        editTextPassword.setError("Minimum length of password is 6");
        //requestfocus zorgt er voor dat er bij elke input wordt geluisterd bij de respective listener component. in dit geval editTextPassword.
        editTextPassword.requestFocus();
        return;

    }
    //roept de methode aan van google firebase. om mensen te laten inloggen en registreren via email en password.
    mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if (task.isSuccessful()) {

                //Toast maakt kleine android popup. Length short is de duratie hoe lang de popup blijft staan
                Toast.makeText(getApplicationContext(), "User Registered Successfull", Toast.LENGTH_SHORT).show();

                //Maakt een string van de currect user ID van firebase. getUid = get user ID
                String gebruiker_id = mAuth.getCurrentUser().getUid();

                //Refereert naar de database. De app weet de database te vinden via FIrebaseDatabase.getInstance(). En pakt gelijk de referencies. De .child zijn child tabels van de database
                DatabaseReference current_gebruiker_db = FirebaseDatabase.getInstance().getReference().child("Gebruikers").child(gebruiker_id);

                //Maak een string van de ingevoerde text voor Map newpost.
               String naam = editTextNaam.getText().toString();
                String geboortedatum = editTextGeboortedatum.getText().toString();
                String postcode = editTextPostcode.getText().toString();

                if (punten < 5){
                    punten = 0;
                }

                //Map newpost zorgt er voor dat alles tegelijke tijd wordt geupload in de database
                //Hashmap is een hash tabel gebaseerd op java'smap interface met een collectie of key-value pairs. In dit geval zijn dat "naam", naam etc. dit zorgt er voor dat er geen gedupliceerde keys kunnen zijn
                Map newPost = new HashMap();
                newPost.put("Naam", naam);
                newPost.put("Geboortedatum", geboortedatum);
                newPost.put("Postcode", postcode);
                newPost.put("Punten", punten);
                //Update de values in de database
                current_gebruiker_db.setValue(newPost);

                //Start een nieuwe activity. van SignupActivity naar HomeActivity
                Intent intent = new Intent(SignUpActivity.this, HomeActivity.class);
                //Zou er voor moeten zorgen dat je niet terug naar de signup activity kan als je eenmaal in de homeactivity zit.
                intent.addFlags(intent.FLAG_ACTIVITY_CLEAR_TOP);
                //Begint met de nieuwe activity.
                startActivity(intent);

            } else {
                //task.getexception zijn bijzonderheden. FirebaseAuthusercollisionException betekent dat de user al geregistreerd is.
                //LENGTH_SHORT is de duratie hoelang de toast (android pop-up) gedisplayed is.
                if(task.getException() instanceof FirebaseAuthUserCollisionException){
                    Toast.makeText(getApplicationContext(), "You are already registered", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getApplicationContext(), task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                }
            }
        }
    });
}

@Override
//onclick viewview heroept de onclick listener.
public void onClick(View view) {
    //Switch statement die heeft meerdere nogelijkheden. Switch statements werken met cases. Als een case wordt herroepen switch hij naar die case.
    switch (view.getId()) {
        //als er op de buttonSignup wordt geclickt dan exuceert bij de registerUser.
        case R.id.buttonSignUp:
            registerUser();
            //nadat de registeruse is herroepen moet hij stoppen met break.
            break;

        case R.id.textViewLogin:
           //Als de case textViewLogin wordt herroepen dan start bij  een nieuwe activity.
            startActivity(new Intent(this, MainActivity.class));


    }
}

}

1 个答案:

答案 0 :(得分:0)

这是检索数据的正确方法

// Get a reference to our posts
final FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("server/saving-data/fireblog/posts");

// Attach a listener to read the data at our posts reference
ref.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    Post post = dataSnapshot.getValue(Post.class);
    System.out.println(post);
  }

  @Override
  public void onCancelled(DatabaseError databaseError) {
    System.out.println("The read failed: " + databaseError.getCode());
  }
});

快照后,您需要调用getValue而不是要字符串化

 for (DataSnapshot datas : dataSnapshot.getChildren()){
               String keys = datas.child("Postcode").toString();
               c.setText("Postcode :"+keys);

所以第一个错误是您没有获取值/第二个请求的结构也错了,您错过了UIS步骤