Firebase2

박승현·2022년 4월 26일
0

복습

Firebase

  • 메세지 라는 이름으로 data를 저장했다
  • noSQL
  • message가 컬랙션(관계형 db는 테이블)
  • collection안에 document 형태로 존재
  • 그 안에 key:value (String,number,boolean,object,Array)

mainActivity

  • getinstance()는 받아올 수 있다
  • valueEventListener:참조하고있는
    경로에 대해 데이터의 변화가 생기면
    감지를 해 데이터를 읽어올 수 있는 이벤트

addChildEventListener로 접근 해야한다
message경로 안 데이터에 접근이냐
그 안에 또 다른 데이터에 접근이냐
에 따라 이벤트 메소드가 다르다!

value vs child

       myRef.addChildEventListener(new ChildEventListener() {
           @Override
           public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
               PersonVO value = snapshot.getValue(PersonVO.class);

               Log.d(TAG,"Value is "+value);
           }

chatAdapter

① 객체 선언

    Context context;
    int layout;
    ArrayList<ChatVO> list;
    LayoutInflater inflater; //xml->view로 변환★

② 생성자 만들기

    public ChatAdapter(Context context, int layout, ArrayList<ChatVO> list) {
        this.context = context;
        this.layout = layout;
        this.list = list;
        //inflater 초기화 이걸 초기화해줘야 xml > view로 변환 가능★
        this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    //list.size를 넣어야 데이터를 갯수만큼 생성해서 보여주기 가능
    public int getCount() {
        return list.size();
    }

    @Override
    //데이터를 담아주니까
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

④ findview

  • 아이디를 접근 할 수 있는 용도
  • 위 레이아웃에서 접근하는데..
    어댑터에서 접근하려면 레이아웃에서 접근해야함
    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {

        //i가 하는 역할은 인덱스 위치!
        //view는 아이템 레이아웃을 모두 가진 부모 레이아웃(리스트뷰)
        //로직 구현 시작!

        //1.뷰 초기화
        if(view == null){
            //view는 chat_item.xml의 정보를 가진 객체
            view = inflater.inflate(layout,viewGroup,false);
        }
        ImageView imgOther = view.findViewById(R.id.imgOther);
        TextView tvOtherNm = view.findViewById(R.id.tvOtherNm);
        TextView tvOtherMsg = view.findViewById(R.id.tvOtherMsg);
        TextView tvOtherTime = view.findViewById(R.id.tvOtherTime);
        TextView tvMyMsg = view.findViewById(R.id.tvMyMsg);
        TextView tvMyTime = view.findViewById(R.id.tvMyTime);


        return view;
    }

⑤Chatvo 구현

        ChatVO vo = list.get(position);
        imgOther.setImageResource(vo.getImgId());
        tvOtherNm.setText(vo.getName());
        tvOtherMsg.setText(vo.getMsg());
        tvMyTime.setText(vo.getTime());
        
        tvMyMsg.setText(vo.getMsg());
        tvMyTime.setText(vo.getTime());

ChatActivity

    ListView ChatList;
    ChatAdapter adapter;
    ArrayList<ChatVO> list;

    EditText edtMsg;
    Button btnSend;

        ChatList = findViewById(R.id.ChatList);
        edtMsg = findViewById(R.id.edtMsg);
        btnSend = findViewById(R.id.btnSend);
        list = new ArrayList<>();

 FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myRef  = database.getReference("talk");

④ 3전

    String currentId = getIntent().getStringExtra("login_id");
        Log.d("CharActivity","현재 로그인한 아이디 : "+currentId);

⑤ db 저장

        //1.버튼 클릭 시 입력된 메세지를 파이어베이스 데이터베이스에 저장
        btnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String msg = edtMsg.getText().toString();

                //저장시 채워넣는 push
                myRef.push().setValue(new ChatVO(R.drawable.ic_launcher_background,
                        currentId,
                        msg,
                        "10:25"));
            }
        });

⑥ list객체에 저장

0개의 댓글