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

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

我的firebase看起来像这样

香港专业教育学院试图用所有可能的数据快照做到这一点。但我认为这是因为用户必须先登录。

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));


    }
}

}

参考方案

这是检索数据的正确方法

// 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步骤

Java Double与BigDecimal - java

我正在查看一些使用双精度变量来存储(360-359.9998779296875)结果为0.0001220703125的代码。 double变量将其存储为-1.220703125E-4。当我使用BigDecimal时,其存储为0.0001220703125。为什么将它双重存储为-1.220703125E-4? 参考方案 我不会在这里提及精度问题,而只会提及数字…

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…