오늘은 파이어베이스의 데이터를 사용자마다 다르게 관리하는 방법에 대해서 알아볼 것이다.
이게 무슨말이냐면 파이어베이스 로그인 기능을 구현했을 때 로그인한 사람의 데이터만 보여지도록 해야하는데 코드로 그 부분을 구현하지 않는다면 자신의 데이터가 모두에게 보여질 수가 있다.
그 방법에 대해서 차근차근 알아가보자
먼저 파이어베이스 스토리지에 이미지를 보내는 코드이다.
try {
progressDialog = new ProgressDialog(this);
progressDialog.setTitle("파일 업로드중....");
progressDialog.show();
StorageReference storageRef = storage.getReference();
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String the_uid = user.getUid();
Uri file = Uri.fromFile(new File(uri));
final StorageReference riversRef = storageRef.child(the_uid+"/"+file.getLastPathSegment());
UploadTask uploadTask = riversRef.putFile(file);
Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
@Override
public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
if (!task.isSuccessful()) {
throw task.getException();
}
// Continue with the task to get the download URL
return riversRef.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful())
{
Toast.makeText(UploadActivity.this, "업로드 성공", Toast.LENGTH_SHORT).show();
//파이어베이스에 데이터베이스 업로드
@SuppressWarnings("VisibleForTests")
Uri downloadUrl = task.getResult();
ImageDTO imageDTO = new ImageDTO();
imageDTO.setImageUrl(downloadUrl.toString());
imageDTO.setTitle(file.getLastPathSegment());
imageDTO.setDescription(etDesc.getText().toString());
imageDTO.setUid(mAuth.getCurrentUser().getUid());
// imageDTO.setUserid(mAuth.getCurrentUser().getEmail());
//image 라는 테이블에 json 형태로 담긴다.
//database.getReference().child("Profile").setValue(imageDTO);
// .push() : 데이터가 쌓인다.
database.getReference().child(the_uid).push().setValue(imageDTO);
finish();
} else {
// Handle failures
// ...
}
}
});
}catch (NullPointerException e)
{
Toast.makeText(UploadActivity.this, "이미지 선택 안함", Toast.LENGTH_SHORT).show();
}
}
평범하게 파이어베이스 스토리지 데이터를 가져오는 코드에다가
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String the_uid = user.getUid();
를 추가해줘서 사용자의 uid를 얻어온다음
final StorageReference riversRef = storageRef.child(the_uid+"/"+file.getLastPathSegment());
위 코드처럼 the_uid를 이용해 사진을 저장할 폴더의 이름을 사용자의 uid로 하고 그 폴더 안에 들어갈 사진이름은 그대로 넣어주었다.
그 다음에 파이어베이스 스토리지에 저장한 사진을 불러오는 코드를 보겠다.
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String the_uid = user.getUid();
final UploadedImageAdapter uploadedImageAdapter = new UploadedImageAdapter(imageDTOList, uidList);
recyclerView.setAdapter(uploadedImageAdapter);//데이터 넣기
//옵저버 패턴 --> 변화가 있으면 클라이언트에 알려준다.
firebaseDatabase.getReference().child(the_uid).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) { //변화된 값이 DataSnapshot 으로 넘어온다.
//데이터가 쌓이기 때문에 clear()
imageDTOList.clear();
uidList.clear();
for(DataSnapshot ds : dataSnapshot.getChildren()) //여러 값을 불러와 하나씩
{
ImageDTO imageDTO = ds.getValue(ImageDTO.class);
String uidKey = ds.getKey();
imageDTOList.add(imageDTO);
uidList.add(uidKey);
}
uploadedImageAdapter.notifyDataSetChanged();
}
처음 코드랑 같이 uid를 가져오는 코드를 먼저 작성해준 뒤
firebaseDatabase.getReference().child(the_uid).addValueEventListener(new ValueEventListener(
위 코드 부분에 child에 데이터를 가져오는 이름 부분만 the_uid로 바꿔주면 자신의 uid에 맞게 데이터를 불러와서 보여진다.
이처럼 사용자마다 데이터가 다르게 관리되는 것을 볼 수가 있다.
'개발 > Android' 카테고리의 다른 글
안드로이드 파이어베이스(Firebase) 데이터 삭제하는 방법 (0) | 2023.04.22 |
---|---|
안드로이드 Intent를 이용하여 선택한 Recyclerview 화면으로 포커싱하는 방법 (0) | 2023.04.21 |
안드로이드 Fragment에서 ListView와 Adpater 사용하기 (0) | 2023.04.19 |
안드로이드 Fragment에서 뒤로가기 버튼 적용하기 onBackPressedListener (0) | 2023.04.18 |
안드로이드 Fragment에서 Fragment 이동 및 애니메이션 효과 (0) | 2023.04.17 |
댓글