본문 바로가기
AndroidStudio

Firebase :google 클라우드 백엔드 플랫폼: firebasefirestoreDB

by EUN-JI 2023. 9. 7.
plugins {
    id 'com.google.gms.google-services' version '4.3.15' apply false
}
plugins {
    id 'com.google.gms.google-services'
}
dependencies {
    implementation platform('com.google.firebase:firebase-bom:32.2.3')
    implementation("com.google.firebase:firebase-firestore")

}

XML<ex71>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/input_layout_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="이름">
        <com.google.android.material.textfield.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="text"/>
    </com.google.android.material.textfield.TextInputLayout>

    <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/input_layout_age"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="나이">
        <com.google.android.material.textfield.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="number"/>
    </com.google.android.material.textfield.TextInputLayout>
    <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/input_layout_address"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="주소">
        <com.google.android.material.textfield.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="text"/>
    </com.google.android.material.textfield.TextInputLayout>

    <Button
        android:id="@+id/btn_save"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="save"/>
    <Button
        android:id="@+id/btn_load"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="load"/>

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="result"
        android:textColor="@color/black"
        android:textStyle="bold"
        android:padding="8dp"/>
    <Button
        android:id="@+id/btn_search"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="search data"/>



</LinearLayout>

JAVA

package com.eunji0118.ex71firebasefirestoredatabase;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.Toast;

import com.eunji0118.ex71firebasefirestoredatabase.databinding.ActivityMainBinding;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;
import com.google.firebase.firestore.QueryDocumentSnapshot;
import com.google.firebase.firestore.QuerySnapshot;

import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {
    ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding=ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        binding.btnSave.setOnClickListener(view -> clickSave());
        binding.btnLoad.setOnClickListener(view -> clickLoad());
        binding.btnSearch.setOnClickListener(view -> clickSearch());
    }

    void clickSave(){
        String name = binding.inputLayoutName.getEditText().getText().toString();
        int age= Integer.parseInt(binding.inputLayoutAge.getEditText().getText().toString());
        String address=binding.inputLayoutAddress.getEditText().getText().toString();

        //Firestore DB 관리객체 소환
        FirebaseFirestore firebaseFirestore=FirebaseFirestore.getInstance();
        //user라는 이름의 컬렉션참조 (RDBMS의)테이블이름 같은 역할 //표이름
        CollectionReference userRef= firebaseFirestore.collection("user");
        //데이터 넣기
        Map<String,Object> user= new HashMap<>();
        user.put("name",name);
        user.put("age",age);
        user.put("address",address);
        //.document() 괄호 안에 new Date하면 정렬됨. //////
        //도큐먼트 명이 랜덤하게 만들어짐 .  document는 RDBNS에 row에 해당함.
        userRef.document().set(user).addOnSuccessListener(unused -> {
            Toast.makeText(this, "insert success", Toast.LENGTH_SHORT).show();
        });

    }
    void clickLoad(){
        FirebaseFirestore firebaseFirestore=FirebaseFirestore.getInstance();
        CollectionReference userRef=firebaseFirestore.collection("user");
        //비동기 방식임..   쓰레드 //회사에서 많이씀.   //스냅샷 순간사진을 찍음 쿼리스냅샷, 도큐먼트스냅샷
        userRef.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {

                StringBuffer buffer=new StringBuffer();
                for (QueryDocumentSnapshot snapshot: queryDocumentSnapshots){
                    Map<String, Object> user= snapshot.getData();
                    String name= user.get("name").toString();
                    int age= Integer.parseInt(user.get("age").toString());
                    String address=user.get("address").toString();

                    buffer.append(name+","+age+","+address+"\n");
                }
                binding.tv.setText(buffer.toString());
            }
        });

    }

    void clickSearch(){
        //name변수 사용자가 입력한 값
        String name=binding.inputLayoutName.getEditText().getText().toString();

        FirebaseFirestore firebaseFirestore=FirebaseFirestore.getInstance();
        CollectionReference userRef= firebaseFirestore.collection("user");
        userRef.whereEqualTo("name",name).addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
                StringBuffer buffer=new StringBuffer();
                for (QueryDocumentSnapshot snapshot: value){
                    Map<String,Object> user= snapshot.getData();
                    String name= user.get("name").toString();
                    int age=Integer.parseInt(user.get("age").toString());
                    String address=user.get("address").toString();

                    buffer.append(name+":"+age+"-"+address+"\n");
                }
                binding.tv.setText(buffer.toString());
            }
        });
    }
}