Невозможно обновить базу данных Firebase Realtime в Android - PullRequest
1 голос
/ 03 июля 2019

Я пытаюсь создать приложение, в котором у пользователя есть возможность изменить свое имя, адрес электронной почты и т. Д. Несмотря на то, что я получаю правильный идентификатор пользователя, всякий раз, когда я пытаюсь обновить базу данных, приложение вылетает, говоря:

`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 ]

2 голосов
/ 03 июля 2019

Могу предложить некоторые изменения, которые сделают ваш код более понятным и простым для отладки.

Сначала используйте имена для ссылок на вашу базу данных, которые идентифицируют узел в базе данных так:

FirebaseDatabase db = FirebaseDatabase.getInstance();

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

Сейчасиспользуйте эту ссылку для добавления события с одним значением вместо события значения, так как вам нужно прочитать данные один раз, чтобы показать профиль, и после обновления профиля вы можете вызвать событие с одним значением снова, если вам нужно.userProfileRef.addSingleValueEvent(...)

Далее вместо значения настройки вы можете использовать update для записи всех значений одновременно.Создайте HashMap<String,Object> (Объект, если у вас разные типы данных для разных полей).Мы будем вызывать update со ссылкой на userProfileRef, поэтому ключом будет просто имя поля профиля

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

Этот вызов обновления возвращает задачу, для которой вы можете добавить onCompletionListener и уведомить пользователя об обновлении профиля.

1 голос
/ 03 июля 2019

Проверьте вашу декларацию и внесите в нее следующие изменения:

private DatabaseReference mFirebaseDatabase;

и присвойте ему значение после того, как вы создали mFirebaseDatabase

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

Проверьте, работает ли он или нет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...