java - 使用 uid 显示当前用户实时数据库中的某些数据

标签 java android firebase firebase-realtime-database firebase-authentication

我尝试了很多方法,包括重新排列子位置,但仍然不起作用。我想在主页上使用 uid 显示实时数据库中的 BMI,但 TextView 中的值仍然为空。任何人请帮助我,因为我还是 firebase 的新手。

额外信息:BMI 值是根据之前的 Activity 计算得出的。

this is my structure from firebase

my current output

what i want

这是主页 Activity :

public class HomepageUser extends AppCompatActivity {

TextView showBMI;
DatabaseReference myRef;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_homepage_user);
    showBMI = ( TextView) findViewById(R.id.showBMI);

    //Database
    //FirebaseDatabase database = FirebaseDatabase.getInstance();
    myRef = FirebaseDatabase.getInstance().getReference("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("bmi");

}
// Read from the database

@Override
protected void onStart() {
    super.onStart();
    myRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            String finalBmi = (String)dataSnapshot.child("bmi").getValue();
            showBMI.setText( ("BMI:   " + finalBmi));
        }

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

        }
    });
}

这是上一个 Activity 的代码:

private void updateBMI(double bmi, final FirebaseUser currentUser) {

    kg = Double.parseDouble(inputKg.getText().toString());
    m = Double.parseDouble(inputM.getText().toString());


    metricFormula = new MetricFormula(kg, m);
    imperialFormula = new ImperialFormula(kg, m);

    //bmi = String.valueOf(TWO_DECIMAL_PLACES.format(metricFormula.computeBMI(metricFormula.getInputKg(),metricFormula.getInputM())));
    bmi = Double.parseDouble(TWO_DECIMAL_PLACES.format(metricFormula.computeBMI(metricFormula.getInputKg(),metricFormula.getInputM())));

    final double finalBmi = bmi;

    mAuth.updateCurrentUser(currentUser).addOnCompleteListener(this, new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {

            UserProfileChangeRequest profileUpdate = new UserProfileChangeRequest.Builder()
                    .build();

            currentUser.updateProfile(profileUpdate)
                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if(task.isSuccessful()){

                                Map<String, Object> values = new HashMap<>();
                                values.put("bmi", finalBmi);

                                FirebaseDatabase.getInstance().getReference("Users")
                                        .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                                        .updateChildren(values).addOnCompleteListener(new OnCompleteListener<Void>() {
                                    @Override
                                    public void onComplete(@NonNull Task<Void> task) {
                                        //progressBar.setVisibility(View.GONE);
                                        if (task.isSuccessful()) {
                                            //acc successfully registered
                                            showMessage("Account Updated");

                                            updateUI();
                                        }
                                        else{
                                        }
                                    }
                                });

                            }
                        }
                    });
        }
    });

}

//next page
private void updateUI() {

    Intent homepageActivity = new Intent(EditProfileActivity.this,HomepageUser.class);
    //homepageActivity.putExtra("bmi",bmi); //new
    startActivity(homepageActivity);
    finish();

}

尝试了很多方法,还是不行。

最佳答案

您正在将监听器附加到:

myRef = FirebaseDatabase.getInstance().getReference("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("bmi");

所以/Users/$uid/bmi。然后您可以使用以下命令读取该值:

myRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        String finalBmi = (String)dataSnapshot.child("bmi").getValue();
        showBMI.setText( ("BMI:   " + finalBmi));
    }

所以此时您正在阅读 /Users/$uid/bmi/bmi,它不存在。

要解决此问题,请从 onDataChange 中删除 child("bmi"):

myRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        String finalBmi = (String)dataSnapshot.getValue();
        showBMI.setText( ("BMI:   " + finalBmi));
    }

关于java - 使用 uid 显示当前用户实时数据库中的某些数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56657974/

相关文章:

java - 在运行之前修改Java中的cucumber特征文件

java - 包含一个包含 JSP 的页面并加载各种 CSS 文件

android - 如何访问 Android 应用程序沙箱存储下的 SQLite 数据库?

firebase - 使用 React Native 将图像源设置为 Firebase Storage URL

javascript - 单元测试 firebase 函数 : how to stub firebase-admin sdk

java - rdf :id 的 sparql 查询

java - 安卓/Java。 AsyncTask/Thread 在我需要时将数据传递回 UI(不仅在执行前/执行后)

android - 如何更改android中的工作区?

android - 如何正确分离 Dao 类和业务逻辑类?

ios - 防止重复的用户名导致线程 1 : signal SIGABRT