datasnapshot

时间:2018-11-24 08:18:33

标签: java android firebase firebase-realtime-database

我知道过去曾有人问过这个问题。我尝试了几乎所有的解决方案都不适合我。抱歉再次询问。但是有人可以帮我解决此错误。

  

这是我的代码。

public class ProfileActivity extends AppCompatActivity {

TextView userEmail;
TextView userID;
TextView userGender;
TextView userName;
Button userLogout;

FirebaseAuth firebaseAuth;
FirebaseUser firebaseUser;

FirebaseDatabase firebaseDatabase;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_profile);

    userEmail = findViewById(R.id.tvUserEmail);
    userGender = findViewById(R.id.tvGender);
    userName = findViewById(R.id.tvName);
    userID = findViewById(R.id.tvUserID);
    userLogout = findViewById(R.id.btnLogout);

    firebaseAuth = FirebaseAuth.getInstance();
    firebaseUser = firebaseAuth.getCurrentUser();


    firebaseDatabase = FirebaseDatabase.getInstance();
    DatabaseReference databaseReference = firebaseDatabase.getReference().child(firebaseUser.getUid());

    //userEmail.setText(firebaseUser.getEmail());

    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            String userEmailstr = dataSnapshot.child("email").getValue().toString();
            String userNamestr = dataSnapshot.child("name").getValue().toString();
            String userGenderstr = dataSnapshot.child("gender").getValue().toString();
            String userIDstr = dataSnapshot.child("id").getValue().toString();


            userEmail.setText(userEmailstr);
            userGender.setText(userGenderstr);
            userName.setText(userNamestr);
            userID.setText(userIDstr);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(getApplicationContext(),databaseError.getMessage(),Toast.LENGTH_SHORT).show();
        }
    });



    userLogout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            FirebaseAuth.getInstance().signOut();
            Intent intent = new Intent(ProfileActivity.this, MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(intent);
        }
    });
}}

该错误在Datasnapshot字符串上。据说在空对象引用上的地方

  

这是logcat

 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
    at com.example.patrick.test.ProfileActivity$1.onDataChange(ProfileActivity.java:60)
    at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@16.0.5:75)
    at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@16.0.5:63)
    at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@16.0.5:55)
  

这是我的数据库   enter image description here

3 个答案:

答案 0 :(得分:2)

您需要更改

DatabaseReference databaseReference = firebaseDatabase.getReference().child(firebaseUser.getUid());

收件人

DatabaseReference databaseReference = firebaseDatabase.getReference().child("Accounts").child(firebaseUser.getUid());

您指向错误的节点。不包含必需的数据。

注意:

您无需将push_id存储为id

您可以简单地获取它而无需将其存储在内部。

String userIDstr = dataSnapshot.getKey();

答案 1 :(得分:2)

您需要更改

DatabaseReference databaseReference = firebaseDatabase.getReference().child(firebaseUser.getUid())

收件人

DatabaseReference databaseReference = firebaseDatabase.getReference().child("Accounts").child(firebaseUser.getUid());

而不是

String userEmailstr = dataSnapshot.child("email").getValue().toString();

使用

String userEmailstr = dataSnapshot.child("email").getValue(String.class);

答案 2 :(得分:2)

您在使用什么:

.child(firebaseUser.getUid())

这意味着您要将来自Firebase身份验证过程的用户ID传递给子方法。但是,传递此ID并没有帮助,因为在您的数据库中,我看到您拥有一个push()方法生成的ID,而不是来自FirebaseUser对象的ID。

为解决此问题,您可以将正确的ID传递给child()-LS3X ... 6Meg方法,或者通过删除{{1}来更改将用户添加到数据库的方式。 }调用并使用类似这样的内容:

push()

第二种解决方案是推荐的解决方案。另外,请不要忘记从参考中添加现在丢失的String uid = FirebaseAuth.getInstance().getCurrentUser().getUid(); DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); rootRef.child("Accounts").child(uid).setValue(userObject); 个额外的孩子。