막무가내 삽질 블로그

안드로이드 파이어베이스를 사용하여 저장된 데이터 수정,삭제 본문

Android

안드로이드 파이어베이스를 사용하여 저장된 데이터 수정,삭제

joong~ 2019. 6. 3. 02:21
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

Comments