繁体   English   中英

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

[英]Unable to update Firebase Realtime Database in Android

我正在尝试创建一个应用程序,用户可以选择更改他的名字,电子邮件等。即使我收到了正确的用户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

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

编辑

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

我可以建议的一些更改将使您的代码更清晰,更容易调试。

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

FirebaseDatabase db = FirebaseDatabase.getInstance();

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

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

接下来而不是设置值,您可以使用update一次写入所有值。 创建HashMap<String,Object> (如果不同字段有不同的数据类型,则为Object)。 我们将参考userProfileRef调用update,因此key只是profile字段名称

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

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

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

private DatabaseReference mFirebaseDatabase;

并在创建mFirebaseDatabase后为其赋值

mFirebaseDatabase= FirebaseDatabase.getInstance().getReference();
mFirebaseDatabase.child("/*Pass you're collection name*/").child(userID).child("email").setValue(emailTest);

检查它是否正常工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM