Welcome! Everything is fine.

[Android] Firebase Realtime Database 이용해 북마크 만들기 본문

Android

[Android] Firebase Realtime Database 이용해 북마크 만들기

개발곰발 2023. 5. 11.
728x90

목표 1

  1. 각 사용자의 uid값을 기준으로 북마크를 따로 저장한다.
  2. ‘저장’ 텍스트를 누르면 파이어베이스 Realtime Database에 저장된다.

과정

  • 미리 해야할 것 : 각 사용자의 uid값을 가져오기 위해 회원가입/로그인 기능 만들기, 파이어베이스에 앱 등록하고 Authentication, Realtime Database 추가하기

 

리사이클러뷰마다 북마크를 만들 것이므로 RecipeAdapter.java에 데이터베이스에 북마크 저장하는 코드를 추가한다.

private FirebaseAuth mAuth;
...
mAuth = FirebaseAuth.getInstance();
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("bookmark_ref");

String title = listData.get(i).getTitle();
String image = listData.get(i).getImageUrl();

holder.saveText.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
             myRef
                .child(mAuth.getCurrentUser().getUid())
                .push()
                .setValue(new RecipeData(title, image, url));
    }
});

 

RecipeData.java에 파라미터 다른 생성자 추가

public RecipeData(String title, String imageUrl, String clickUrl) {
    this.title = title;
    this.imageUrl = imageUrl;
    this.clickUrl = clickUrl;
}

결과

 

목표 2

  1. 북마크 탭에서 사용자가 북마크한 레시피 정보를 불러온다.
  2. 각 사용자의 uid값을 기준으로 북마크를 따로 불러온다.
  3. 강의에서는 Activity에 구현했지만 우리는 Activity에 들어가서 스피너에서 식당, 제품, 레시피 중 하나를 선택하여 나오는 프래그먼트에 구현한다.

과정

파이어베이스 Realtime DataBase에서 데이터를 불러오기 위해 addValueEventListener 를 사용하였다. 강의에서는 MutableList에 데이터를 넣었지만 여기선 어댑터에 추가했더니 성공적으로 출력할 수 있었다.

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        mAuth = FirebaseAuth.getInstance();
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myRef = database.getReference("bookmark_ref");

        view = inflater.inflate(R.layout.fragment_farg_bookmark3, container, false);
        recyclerView = view.findViewById(R.id.bookmark3_recyclerView);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(linearLayoutManager);
        adapter = new RecipeAdapter();
        recyclerView.setAdapter(adapter);

        myRef
                .child(mAuth.getCurrentUser().getUid())
                .addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        for(DataSnapshot dataSnapshot : snapshot.getChildren()) {
                            Log.d("DataModel",dataSnapshot.toString());
                            adapter.addItem(dataSnapshot.getValue(RecipeData.class));
                            adapter.notifyDataSetChanged();
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {
                        Log.e("Bookmark", "dbError");
                    }
                });


        return view;
    }

 

레시피 북마크 프래그먼트에 나온 레시피와 아래 로그창, 파이어베이스 데이터베이스에 저장된 레시피가 동일한 것을 볼 수 있다.