无法在Android中更新Firebase实时数据库

时间:2019-07-03 16:42:57

标签: java android firebase firebase-realtime-database

我正在尝试制作一个用户可以选择更改其姓名,电子邮件等的应用程序。即使我获得了正确的用户ID,每当我尝试更新数据库时,该应用程序都会崩溃

`Attempt to invoke virtual method 'com.google.firebase.database.DatabaseReference com.google.firebase.database.DatabaseReference.child(java.lang.String)' on a null object reference`

这是我的代码

  public class EditProfile extends AppCompatActivity {

        FirebaseAuth auth;
        DatabaseReference databaseReference;
        private DatabaseReference mFirebaseDatabase;
        private DatabaseReference mFirebaseInstance;
        String name2 , email2 ;
        EditText name , email , bio;
        private SlidrInterface slidr;
        ImageView profilePic;
        final int PICK_IMAGE_REQUEST = 71;
        Uri imageUri;
        Button saveButton;


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

            auth = FirebaseAuth.getInstance();
            databaseReference = FirebaseDatabase.getInstance().getReference();
            final FirebaseUser user = auth.getCurrentUser();
            name = (EditText) findViewById(R.id.name);
            email = (EditText) findViewById(R.id.email);
            bio = (EditText) findViewById(R.id.bio);
            profilePic = (ImageView) findViewById(R.id.profilepic);
            saveButton = (Button) findViewById(R.id.save);
            slidr = Slidr.attach(this);
            mFirebaseInstance = FirebaseDatabase.getInstance().getReference();
            mFirebaseDatabase = FirebaseDatabase.getInstance().getReference();

            final String userID = user.getUid();
            Log.d("TAG" , "USERID = "+userID );

            databaseReference.child("users").child(user.getUid()).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot){
                    name2 = (String) dataSnapshot.child("name").getValue();
                    String gender = (String) dataSnapshot.child("gender").getValue();
                    email2 = (String) dataSnapshot.child("email").getValue();
                    Log.d("TAG", "Name: " +name2);
                    Log.d("TAG", "Email: " +email);
                    Log.d("TAG", "Gender: " +gender);
                    name.setText(name2);
                    email.setText(email2);

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {}

            });

            profilePic.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent();
                    intent.setType("image/*");
                    intent.setAction(Intent.ACTION_GET_CONTENT);
                    startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);

                }
            });

            saveButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String nameTest = name.getText().toString();
                    String emailTest = email.getText().toString();
                    String bioTest = bio.getText().toString();

                    Log.d("TAG" , "NAMETEST = "+nameTest);

                    mFirebaseDatabase.child(userID).child("name").setValue(nameTest);
                    //mFirebaseDatabase.child(user).child("bio").setValue(bioTest);
                    mFirebaseDatabase.child(userID).child("email").setValue(emailTest);
                }
            });
        }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if(requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK
                    && data != null && data.getData() != null )
            {
                imageUri = data.getData();
                //String test = filepath.toString();
                //Log.d("CameraActivity" , " Path is = " +test);
                try {
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
                    //ByteArrayOutputStream stream = new ByteArrayOutputStream();
                    //bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
                    //byte[] byteArray = stream.toByteArray();
                    profilePic.setImageURI(imageUri);

                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }

            }
        }
     }

我无法理解这里的null object refernce是什么。我已经放入日志语句并检查了各个参数。

D/TAG: USERID = 5tI5e4Y2NeOQ7yq8DwefvmYJk713
D/TAG: Name: Darryl Fernandes
Email: fernsdarryl1@gmail.com
Gender: male

下面是我的数据库的图像 n An

请帮助我解决这个问题。谢谢

编辑

你们可以看到我分离了mFirebaseDatabase的初始化和声明,但是即使错误消失了,它也不会在firebase上更新

2 个答案:

答案 0 :(得分:2)

我可以建议进行一些更改,这将使您的代码更加清晰和易于调试。

首先使用数据库引用的名称来标识数据库中的节点,这样:

FirebaseDatabase db = FirebaseDatabase.getInstance();

DatabaseReference userProfileRef = db.getReference("users").child(userId);

现在使用此引用来添加单值事件而不是值事件,因为您需要读取一次数据以显示配置文件,并且在配置文件更新后,您可以根据需要再次调用单值事件。 userProfileRef.addSingleValueEvent(...)

接下来,除了设置值外,您还可以使用update一次写入所有值。创建一个HashMap<String,Object>(如果不同字段的数据类型不同,则为对象)。 我们将参考userProfileRef调用更新,因此键将只是配置文件字段名称

map.add("email",email)
map.add("name",name);
userProfileRef.update(map);

此更新调用返回一个Task,您可以在其上添加onCompletionListener并通知用户有关配置文件更新的信息。

答案 1 :(得分:1)

检查您的声明并在其中进行以下更改:

private DatabaseReference mFirebaseDatabase;

并在创建 mFirebaseDatabase

后为其分配值
mFirebaseDatabase= FirebaseDatabase.getInstance().getReference();
mFirebaseDatabase.child("/*Pass you're collection name*/").child(userID).child("email").setValue(emailTest);

检查它是否正常工作