막무가내 삽질 블로그
안드로이드 파이어베이스를 사용하여 저장된 데이터 수정,삭제 본문
728x90
오늘은 데이터 수정,삭제코드를 정리한다.
우선 삭제 메소드 부터 보자
private void deleteItem(final int position) {
mStorage.getReference().child("userImages").child("uid/").child(contentslist.get(position).photoName).delete()
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
// removeValue 말고 setValue(null)도 삭제가능
mDatabase.getReference().child("contents").child("content").child(uidLists.get(position)).removeValue()
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(Today_MainActivity.this, "삭제 완료", Toast.LENGTH_LONG).show();
}
}).addOnFailureListener(new OnFailureListener() { // DB에서 Fail날경우는 거의 없음..
@Override
public void onFailure(@NonNull Exception e) {
// fail ui
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(Today_MainActivity.this, "삭제 실패", Toast.LENGTH_LONG).show();
}
});
}
파라미터로 int position을 전달한다. position은 내가 삭제할 게시글의 위치값이다.(리싸이클러뷰내에)
스토리지-userImages-uid/ 리싸이클러뷰내의 삭제할 게시글을 삭제한다.(photoName은 저장했던 절대경로이다)
스토리지에서 이미지를 지웠으니 이제 데이터베이스의 내용도 삭제하면 된다.
DB-contents-content-key값의 현재 위치에 접근해서 해당 게시글을 삭제한다.
onbindViewHolder의 코드이다
if (contentslist.get(i).myid.equals(uid)) { // 게시글에 내 아이디가 있으면
((CustomViewHolder) viewHolder).mmenu.setVisibility(View.VISIBLE);
((CustomViewHolder) viewHolder).mmenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(Today_MainActivity.this);
builder.setTitle("알림");
builder.setMessage("삭제 or 수정");
builder.setIcon(android.R.drawable.ic_dialog_alert);
builder.setPositiveButton("삭제", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
deleteItem(i);
}
});
builder.setNegativeButton("수정", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Today_MainActivity.this, PostModityActivity.class);
intent.putExtra("contentPhoto", contentslist.get(i).photo);
intent.putExtra("content", contentslist.get(i).contents);
intent.putExtra("location", contentslist.get(i).location);
intent.putExtra("key", uidLists.get(i));
intent.putExtra("phtoname", contentslist.get(i).photoName);
startActivity(intent);
finish();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
});
} else {
if(!contentslist.get(i).myid.equals(uid)){
((CustomViewHolder) viewHolder).mmenu.setVisibility(View.INVISIBLE);
}
}
}
자기가 작성한 글은 메뉴버튼을 보이게 하고 상대방의 글은 메뉴버튼을 안보이게 셋팅하였다.
메뉴버튼을 클릭하면 수정or삭제를 할 수 있고 삭제시 스토리지,데이터베이스의 값이 삭제된다.
수정을 누르면 수정을 할 수 있는 액티비티로 전환되고 intent로 필요값들을 보내주었다.
수정게시판 액티비티에서 값을 받은 데이터들을 셋팅해주고 새롭게 사진과 내용을 작성할 수 있게 해주었다.
View.OnClickListener onClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.pm_back:
startTodayMainActivity();
case R.id.pm_next:
final Uri file = Uri.fromFile(new File(path)); // 절대경로uri를 file에 할당
Log.d(TAG, "phto file : " + file);
// 스토리지 userImages-uid/file name으로 저장
StorageReference storageReference = mStorage.getReference().child("userImages").child("uid/"+file.getLastPathSegment());
storageReference.putFile(photoUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
final Task<Uri> imageUrl = task.getResult().getStorage().getDownloadUrl();
while (!imageUrl.isComplete()) ;
// 기존에 있던 사진 스토리지에서 삭제
mStorage.getReference().child("userImages").child("uid/").child(photoname).delete()
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
// 로그인한 아이디에 접근
mDatabase.getReference().child("users").child(uid)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
UserModel userModel = dataSnapshot.getValue(UserModel.class);
PostModel postModel = new PostModel();
postModel.myid = uid;
postModel.photo = imageUrl.getResult().toString();
postModel.userprofileimage = userModel.profileImageUrl;
postModel.photoName = file.getLastPathSegment();
postModel.contents = content.getText().toString();
postModel.location = location.getText().toString();
postModel.username = userModel.userName;
// 게시글 내용 저장
mDatabase.getReference().child("contents").child("content").child(keyresult)
.setValue(postModel).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
//
}
});
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// photoName delete Fail UI
}
});
}
});
startTodayMainActivity();
}
}
};
변경할 사진의 절대경로와 url을 셋팅해줌과 동시에 전에 스토리지에 저장되어 있던 사진을 삭제해주었다.
DB에선 해당키값에 대해 내용값들만 변경해 주었다.
안드로이드 스터디 모집
www.notion.so/fundevjay/Android-ddf96b24265e414fb2d9e8fc5d388b80
'Android' 카테고리의 다른 글
android github file upload, 안드로이드 코드 깃허브에 업로드 (0) | 2019.09.14 |
---|---|
FragmentPagerAdapter 와 FragmentStatePagerAdapter 의 차이 (0) | 2019.09.13 |
안드로이드 파이어베이스 게시글데이터 저장, 불러오기 (1) | 2019.06.02 |
안드로이드 파이어베이스로 사용자 프로필 저장 (3) | 2019.06.02 |
안드로이드 파이어베이스 스토리지에 사진 저장 (0) | 2019.06.01 |
Comments