Добавить новые данные под дочерним с существующими данными с помощью ModelClass - PullRequest
0 голосов
/ 22 сентября 2019

Мне нужна помощь с моим приложением.У меня есть Activity, где я добавляю информацию о пользователе, такую ​​как имя, день рождения и добавляю изображение профиля для пользователя.И когда я добавляю изображение профиля, я получаю это в своей базе данных:

Firebase when added profileimage

И это работает нормально.Я использую ModelClass, и я знаю, что когда я использую setValue, он удаляет существующие данные под этим child и сохраняет новые данные.Но есть ли способ просто добавить новые данные и при этом не удалять существующие данные с помощью ModelClass?Я знаю, что это работает с Hashmap, но я хочу использовать ModelClass.

Firebase when adding user info

Вот моя активность для сохранения информации:

public class UserInfoActivity extends AppCompatActivity implements DatePickerDialog.OnDateSetListener {

private CircleImageView civuserinfoprofileimage;
private EditText etuserinfofirstname, etuserinfolastname;
private Button btnbirthdaypicker, btnsaveuserinfo;
private TextView tvbirthday;


private FirebaseAuth mAuth;
private DatabaseReference UsersRef;
private StorageReference UserProfileImageRef;

private ProgressDialog loadingBar;

String currentUserID;
final static int Gallery_Pick = 1;




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

    mAuth = FirebaseAuth.getInstance();
    currentUserID = mAuth.getCurrentUser().getUid();
    UsersRef = FirebaseDatabase.getInstance().getReference().child("Users").child(currentUserID);
    UserProfileImageRef = FirebaseStorage.getInstance().getReference().child("profilepictures");

    loadingBar = new ProgressDialog(this);

    civuserinfoprofileimage = (CircleImageView)findViewById(R.id.civ_userinfoprofileimage);
    etuserinfofirstname = (EditText)findViewById(R.id.et_userinfofirstname);
    etuserinfolastname = (EditText)findViewById(R.id.et_userinfolastname);
    btnbirthdaypicker = (Button)findViewById(R.id.btn_birthdaypicker);
    tvbirthday = (TextView) findViewById(R.id.tv_birthday);
    btnsaveuserinfo = (Button)findViewById(R.id.btn_saveuserinfo);

    btnsaveuserinfo.setVisibility(View.INVISIBLE);


    btnbirthdaypicker.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            DialogFragment datePicker = new DatePickerFragment();
            datePicker.show(getSupportFragmentManager(), "date picker");
        }
    });

    btnsaveuserinfo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {


                SaveAccountSetupInformation();



        }
    });

    civuserinfoprofileimage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Intent galleryIntent = new Intent();
            galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
            galleryIntent.setType("image/*");
            startActivityForResult(galleryIntent, Gallery_Pick);
        }
    });


}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == Gallery_Pick && resultCode == RESULT_OK && data != null) {
        Uri ImageUri = data.getData();


        CropImage.activity()
                .setGuidelines(CropImageView.Guidelines.ON)
                .setAspectRatio(1,1)
                .start(this);
    }

    if(requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE)
    {
        CropImage.ActivityResult result = CropImage.getActivityResult(data);

        if (resultCode == RESULT_OK) {

            loadingBar.setTitle("Profile Image");
            loadingBar.setMessage("Saving profileimage");
            loadingBar.show();
            loadingBar.setCanceledOnTouchOutside(true);

            Uri resultUri = result.getUri();

            StorageReference filePath = UserProfileImageRef.child(currentUserID + ".jpg");

            filePath.putFile(resultUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                    if(task.isSuccessful()) {

                        btnsaveuserinfo.setVisibility(View.VISIBLE);


                        Task<Uri> result = task.getResult().getMetadata().getReference().getDownloadUrl();


                        result.addOnSuccessListener(new OnSuccessListener<Uri>() {
                            @Override
                            public void onSuccess(Uri uri) {
                                final String downloadUrl = uri.toString();


                                UsersRef.child("profileimage").setValue(downloadUrl)
                                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                                            @Override
                                            public void onComplete(@NonNull Task<Void> task) {
                                                if (task.isSuccessful()) {
                                                    Intent selfIntent = new Intent(UserInfoActivity.this, UserInfoActivity.class);
                                                    selfIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                                                    startActivity(selfIntent);

                                                    Toast.makeText(UserInfoActivity.this, "Pofileimage saved", Toast.LENGTH_SHORT).show();
                                                    loadingBar.dismiss();
                                                } else {
                                                    String message = task.getException().getMessage();
                                                    Toast.makeText(UserInfoActivity.this, "Error: " + message, Toast.LENGTH_SHORT).show();
                                                    loadingBar.dismiss();


                                                }
                                            }
                                        });
                            }
                        });

                    }
                }
            });
        }
        else {
            Toast.makeText(UserInfoActivity.this, "Error: Image can not be cropped. Try Again.", Toast.LENGTH_SHORT).show();
            loadingBar.dismiss();




        }


    }

}
private void SaveAccountSetupInformation() {

    String firstname = etuserinfofirstname.getText().toString();
    String lastname = etuserinfolastname.getText().toString();
    String birthday = tvbirthday.getText().toString();



    if (TextUtils.isEmpty(firstname) || TextUtils.isEmpty(lastname) || TextUtils.isEmpty(birthday)) {

        Toast.makeText(this, "Please enter information..", Toast.LENGTH_SHORT).show();


    } else {

        FirebaseUser firebaseUser = mAuth.getCurrentUser();

        String userid = firebaseUser.getUid();



        User user = new User(userid, firstname, lastname, birthday);



        UsersRef.setValue(user);
    }
}

ModelClass:

public class User {

private String id;
private String lastname;
private String firstname;
private String birthday;
private String profileimage;

public User(String id, String lastname, String firstname, String birthday, String profileimage) {
    this.id = id;
    this.lastname = lastname;
    this.firstname = firstname;
    this.birthday = birthday;
    this.profileimage = profileimage;
}

public User() {
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getLastname() {
    return lastname;
}

public void setLastname(String lastname) {
    this.lastname = lastname;
}

public String getFirstname() {
    return firstname;
}

public void setFirstname(String firstname) {
    this.firstname = firstname;
}

public String getBirthday() {
    return birthday;
}

public void setBirthday(String birthday) {
    this.birthday = birthday;
}

public String getProfileimage() {
    return profileimage;
}

public void setProfileimage(String profileimage) {
    this.profileimage = profileimage;
}

1 Ответ

0 голосов
/ 22 сентября 2019

Насколько я понимаю, вы спрашиваете об этом коде:

User user = new User(userid, firstname, lastname, birthday);

UsersRef.setValue(user);

Пожалуйста, прочитайте о , как создать минимальный, полный, проверяемый пример , так какнам сложнее изолировать этот код, чем он / должен быть для вас.

Когда вы звоните setValue() в определенном месте, любые существующие данные в этом месте заменяются.Чтобы обновить только часть местоположения, вы должны позвонить updateChildren() по нему.Но, как вы обнаружили, вы не можете использовать updateChildren() с классом Java, это займет всего Map.

Если вы хотите обновить только одного ребенка, вы можете использовать setValue на DatabaseReference этому конкретному ребенку.Например:

UsersRef.child("profileimage").setValue("Value of profile image");

Если вы хотите обновить несколько, но не все дочерние узлы, вам нужно использовать updateChildren() с Map.Java 9 и 10, кажется, имеют некоторый хороший синтаксический сахар, чтобы сделать это более читабельным: https://stackoverflow.com/a/6802502

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