안드로이드 Firebase 클라우드 FireStore 데이터베이스

52497 단어 androidandroiddevjava
안녕하십니까, 세상. 오늘 우리는 Firebase 클라우드 Firestore 데이터베이스를 사용하여 todo 응용 프로그램을 만드는 방법을 볼 수 있습니다.Firestore 데이터베이스는 매우 유연하고 확장 가능한 NoSQL 데이터베이스로 우리의 개발을 매우 빠르게 한다.
Firestore는android에서 사용하기 쉽습니다.FireStore는 오프라인 상태에서도 애플리케이션이 오프라인으로 작동하고 인터넷에 다시 연결될 때 데이터를 업데이트할 수 있도록 디바이스의 캐시에서 데이터를 추출할 수 있습니다.
이것은 기능적으로 당신의 응용 프로그램이 사용자와 상호작용을 하게 합니다.
Firestore 데이터베이스의 또 다른 기능은 데이터베이스의 변화를 실시간으로 관찰하는 것이다. 응용 프로그램에서 업데이트를 표시할 수 있다.
Firestore 데이터베이스는 필요에 따라 데이터를 필터링할 수 있도록 조회를 실행할 수 있습니다. 이 기능은 Firestore 데이터베이스를 프로젝트에 사용할 수 있도록 합니다.
Firestore 데이터베이스는 컬렉션에 저장된 데이터를 문서에 저장합니다.상상해 보세요. 이 집합은 폴더입니다. 그중에 여러 개의 문서가 있습니다. 이 문서에는 데이터가 적혀 있습니다.

Firebase 클라우드 FireStore 데이터베이스로 구축되는 응용 프로그램을 살펴보겠습니다.

응용 프로그램을 만들어 봅시다.

Firebase 콘솔에서 새 항목 만들기


우선, Firebase 컨트롤러에 새로운 프로젝트를 만들어야 합니다.https://console.firebase.google.com/으로 넘어가서 새 프로젝트를 클릭하여 새 프로젝트를 만듭니다.모든 설명을 따르다.

프로젝트를 만든 후, 우리의android 프로젝트를 추가합시다.android 아이콘을 누르십시오.

그런 다음 패키지 이름을 입력하고 응용 프로그램 이름을 입력합니다.
구글 서비스를 다운로드하다.json 파일을 응용 프로그램의 프로그램 폴더에 붙여넣습니다.
그리고 Firebase의 지시에 따라 조작하세요.필요한 의존 항목을 추가하고 동기화 단추를 누르십시오.
당신의 의존항은 아래와 같습니다.
dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.recyclerview:recyclerview:1.1.0' // recyclerview dependency
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

    implementation 'com.google.firebase:firebase-analytics:17.4.4' // firebase required dependency
    implementation 'com.google.firebase:firebase-firestore:21.5.0' // firebase firestore dependency

}
우리는 Firestore와 recyclerview에 의존항을 추가했다.
이제 레이아웃을 응용 프로그램으로 만듭니다.

응용 프로그램 레이아웃 만들기


레이아웃을 위해 activity_main에 이 코드를 추가합니다.xml 파일
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_height="match_parent"
    tools:context=".MainActivity"
    android:padding="10sp"
    >
    <EditText
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:id="@+id/editTextTask"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@id/addTaskBtn"
        android:layout_marginTop="20sp"
        android:hint="Add New Task"
        android:layout_marginLeft="2sp"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/addTaskBtn"
        android:text="add"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="@id/editTextTask"
        app:layout_constraintBottom_toBottomOf="@id/editTextTask"
        />
    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="0sp"
        android:id="@+id/taskRecyclerView"
        app:layout_constraintTop_toBottomOf="@id/editTextTask"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginTop="15sp"

        />
</androidx.constraintlayout.widget.ConstraintLayout>
위의 코드에서 텍스트, 단추, 순환 보기를 편집했습니다.
응용 프로그램 수준 구축에 다음 의존항을 추가합니다.gradle 파일은 프로젝트에서recyclerview를 사용합니다.
"androidx"를 실현합니다.회수 보기: 회수 보기: 1.1.0
recyclerview에 대한 더 많은 정보를 알고 싶으면 여기서 보십시오.
현재 우리는 recyclerview의 프로젝트 구조를 만들어야 한다.
새 레이아웃 파일을 만들고 이 코드를 추가합니다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/checkBoxTask"
        android:text="Task 1"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:textAppearance="@style/TextAppearance.AppCompat.Large"
        android:checked="true"
        />
    <ImageView
        android:layout_width="35sp"
        android:layout_height="35sp"
        android:id="@+id/deleteTaskBtn"
        android:src="@drawable/ic_delete"
        app:layout_constraintTop_toTopOf="@id/checkBoxTask"
        app:layout_constraintRight_toRightOf="parent"
        />
</androidx.constraintlayout.widget.ConstraintLayout>
위의 코드에는 삭제 단추로 체크 상자와 imageview가 있고 각각의 ID를 설정합니다.
프로젝트에 삭제 아이콘을 추가하려면drawable Folder를 오른쪽 단추로 누르고 new를 선택한 다음vector assets를 누르면 다음 창에서 아이콘과 아이콘 이름을 선택하고 아이콘을 저장해서 쉽게 추가할 수 있습니다. 이미지뷰에서 이 아이콘을 사용할 수 있습니다.
이 모든 것이 끝난 후에 우리는 응용 프로그램의 기능을 추가할 것이다.
기능을 실현하기 전에, 우리는 Firebase 컨트롤러에 데이터베이스를 만들어야 한다.Firebase 프로젝트로 이동하여 "개발"을 누르고 데이터베이스를 선택한 다음 "데이터베이스 만들기"를 누르십시오.
두 가지 옵션이 있습니다.하나는 클라우드 FireStore에 사용되고 다음 두 번째 옵션은 실시간 데이터베이스에 사용됩니다.하지만 클라우드 FireStore를 위한 데이터베이스를 만들어야 합니다.
현재 우리는 모델 클래스 (POJO 대상 클래스) 를 만들어야 합니다. 이 클래스는 Firebase와 recyclerview에서 사용됩니다.

Firebase 및 RecyclerView용 모델 클래스 만들기


우리는 데이터를 저장하기 위해 모델 클래스를 만들어야 한다.모델 클래스는 데이터를 설정하고 getter와setter 함수를 사용하여 데이터를 가져오는 데 도움을 줍니다.사용할 데이터 형식과 필드 수를 지정해야 합니다.다음 코드를 참고하여 대기 응용 프로그램에 대한 모델을 만드십시오.
import com.google.firebase.firestore.DocumentId;

public class TaskModel {

    @DocumentId
    private String taskId;
    private String task;
    private boolean isTaskDone;

    public String getTaskId() {
        return taskId;
    }

    public void setTaskId(String taskId) {
        this.taskId = taskId;
    }

    public String getTask() {
        return task;
    }

    public void setTask(String task) {
        this.task = task;
    }

    public boolean isTaskDone() {
        return isTaskDone;
    }

    public void setTaskDone(boolean taskDone) {
        isTaskDone = taskDone;
    }
}
위의 모델 클래스에서 taskId 위에 주석 @DocumentId를 사용한 것을 발견하면이 설명은taskId 필드가 Firebase 문서의 문서 id로 사용될 것입니다. 우리가firestore 데이터베이스에 데이터를 추가할 때, 이 속성은firestore 데이터베이스에 만들기 위해 무시됩니다.만약 네가 내가 한 말을 이해하지 못한다면, 계속 읽으면 이해할 것이다.
그리고 작업 값을 문자열로 저장하는 작업 문자열 필드를 만듭니다.lat 필드는 작업이 완료되었는지 여부를 표시하는 데 사용됩니다.이후, 우리는 getter와setters 방법을 사용하여 값을 설정하고 값을 얻습니다.
모델을 만든 후 Main Activity로 이동합니다.java와 데이터베이스 기능에 데이터를 추가합니다.

모델 클래스를 사용하여 Firebase Firestore에 데이터 추가


Firestore에 작업 데이터를 추가하려면 편집 텍스트에서 작업 값을 가져와야 합니다. 단추를 누르면 값이 비어 있는지 확인하고 Firebase 함수로 데이터를 추가하는 방법을 보여 줍니다.
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final EditText editTextTask = findViewById(R.id.editTextTask);
        Button addTaskBtn = findViewById(R.id.addTaskBtn);

        addTaskBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String newTask = editTextTask.getText().toString();

                if(newTask.isEmpty()){
                    Toast.makeText(MainActivity.this, "Please add task first.", Toast.LENGTH_SHORT).show();
                    return;
                }

                final TaskModel taskModel = new TaskModel();
                taskModel.setTaskDone(false);
                taskModel.setTask(newTask);

                db.collection("todoCollection")
                        .add(taskModel)
                        .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                            @Override
                            public void onSuccess(DocumentReference documentReference) {
                                editTextTask.setText(null);
                            }
                        });
            }
        });



}
위의 코드에서, 우리는 먼저 Firestore의 데이터베이스 실례를 만든 다음, onCreate 방법에서 활성 xml 레이아웃에서 EditText와 단추를 가져옵니다.
그리고 우리는 단추에서 클릭listener를 실현합니다. 이것은firestore 데이터베이스에 데이터를 추가합니다.클릭 방법에서, 우리는 먼저 편집 텍스트에서 문자열을 가져온 다음, 이 문자열이 비어 있는지 확인합니다.문자열이 비어 있으면toast를 표시하고 방법에서 되돌려줍니다.
그리고 우리는 작업 모델 대상을 만들고 setter 방법으로 값을 설정합니다.taskDone을false로 설정하고taskstring을 설정합니다.Firebase 라이브러리에서 처리되기 때문에taskId를 설정하지 않았습니다.
현재, 우리는 데이터를 데이터베이스에 추가할 것이다.
우선, 우리는 데이터베이스를 사용하여 집합의 인용을 얻는다.방법, 그리고add 방법을 호출하여 우리가 방금 만든 모델을 전달하고 성공 탐지기를 추가합니다.
성공 탐지기에서 EditText에서 문자열을 삭제합니다.
이제 응용 프로그램을 실행하려면 텍스트 편집에 작업을 입력하고 추가 단추를 누르십시오.Firebase 콘솔에서 데이터베이스를 확인하면 모음에 새로 만든 문서가 포함됩니다.
집합이 존재하지 않으면 자동으로 생성됩니다.
이것이 바로 우리가 Firestore 데이터베이스에 데이터를 추가하는 방식이다.
데이터베이스에서 데이터를 가져와recyclerview에 표시하는 방법을 보십시오.

FireStore 데이터베이스에서 데이터를 가져와서 RecyclerView에 표시


recyclerview에 데이터를 표시하기 위해서, 우리는recyclerview를 실현할 때 했던 것처럼 어댑터 클래스를 만들어야 합니다.따라서, 새로운 자바 파일을 만들고recyclerview 어댑터로 확장합니다.
그리고 우리는viewholder 클래스를 전달하여 이 점을 실현해야 한다. 우리는 어댑터 클래스에 내부 클래스를 만들고 어댑터에서 이 클래스를 범용으로 전달하며 모든 필요한 방법을 실현한다.
모든 클래스를 만든 후에, 우리는 매개 변수를 사용하여 구조 함수를 만들어야 합니다.이러한 매개변수는 컨텍스트, 작업 모델 목록 및 데이터베이스 참조입니다.
다음 코드를 참고하여 더욱 잘 이해하십시오.
public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.TaskViewHolder> {

    Context context;
    List<TaskModel> taskModelList;
    FirebaseFirestore db;

    public TaskAdapter(Context context, List<TaskModel> taskModelList, FirebaseFirestore db) {
        this.context = context;
        this.taskModelList = taskModelList;
        this.db = db;
    }

    @NonNull
    @Override
    public TaskViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(context).inflate(R.layout.task_item, parent, false);
        return new TaskViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull TaskViewHolder holder, int position) {

        CheckBox task = holder.task;

        TaskModel taskModel = taskModelList.get(position);
        String taskFromDB = taskModel.getTask();
        boolean isTaskDone = taskModel.isTaskDone();

        task.setText(taskFromDB);
        task.setChecked(isTaskDone);

    }

    @Override
    public int getItemCount() {
        return taskModelList.size();
    }

    class TaskViewHolder extends RecyclerView.ViewHolder{

        CheckBox task;
        ImageView deleteBtn;

        public TaskViewHolder(@NonNull View itemView) {
            super(itemView);
            task = itemView.findViewById(R.id.checkBoxTask);
            deleteBtn = itemView.findViewById(R.id.deleteTaskBtn);

            task.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    final int currentPosition =  getAdapterPosition();
                    TaskModel taskModel = taskModelList.get(currentPosition);

                    String taskId = taskModel.getTaskId();

                    db.collection("todoCollection")
                            .document(taskId)
                            .update("taskDone",isChecked);
                }
            });

            deleteBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    final int currentPosition =  getAdapterPosition();
                    TaskModel taskModel = taskModelList.get(currentPosition);

                    String taskId = taskModel.getTaskId();

                    db.collection("todoCollection")
                            .document(taskId).delete()
                            .addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void aVoid) {
                                    taskModelList.remove(currentPosition);
                                    notifyDataSetChanged();
                                }
                            })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(context, "Failed to delete the task.", Toast.LENGTH_SHORT).show();
                        }
                    })
                    ;
                }
            });
        }
    }
}
getItemCount 메서드에서 목록 크기를 반환합니다.현재viewholder 클래스에 와서 다음 코드를 작성합니다.
class TaskViewHolder extends RecyclerView.ViewHolder{

        CheckBox task;
        ImageView deleteBtn;

        public TaskViewHolder(@NonNull View itemView) {
            super(itemView);
            task = itemView.findViewById(R.id.checkBoxTask);
            deleteBtn = itemView.findViewById(R.id.deleteTaskBtn);

            task.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    final int currentPosition =  getAdapterPosition();
                    TaskModel taskModel = taskModelList.get(currentPosition);

                    String taskId = taskModel.getTaskId();

                    db.collection("todoCollection")
                            .document(taskId)
                            .update("taskDone",isChecked);
                }
            });

            deleteBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    final int currentPosition =  getAdapterPosition();
                    TaskModel taskModel = taskModelList.get(currentPosition);

                    String taskId = taskModel.getTaskId();

                    db.collection("todoCollection")
                            .document(taskId).delete()
                            .addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void aVoid) {
                                    taskModelList.remove(currentPosition);
                                    notifyDataSetChanged();
                                }
                            })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(context, "Failed to delete the task.", Toast.LENGTH_SHORT).show();
                        }
                    })
                    ;
                }
            });
        }
    }
기억하신다면, task\u 항목을 만들었습니다.체크 상자와 삭제 단추가 있는 imageview의 xml입니다.우리는viewholder에서 이 요소들을 사용하고 인용을 만들어서 사용할 것입니다.
어댑터의 onBindViewHolder 메서드에서확인란 텍스트와 검사 상태를 설정하고 있습니다.
현재 주요한 일은 데이터베이스에 있는 기존 작업 값을 업데이트하는 것이다.사용자가 체크 상자를 선택하거나 선택 취소할 때 데이터베이스에 있는 작업 완료 값을 업데이트하려고 합니다.우리는viewholder에 탐지기를 추가해야 합니다.
우리task_프로젝트에 바람을 넣습니다.onCreateViewHolder의 xml 보기입니다.
별도: Make Night Theme in Android

FiresStore 데이터베이스에서 값 업데이트


task.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    final int currentPosition =  getAdapterPosition();
                    TaskModel taskModel = taskModelList.get(currentPosition);

                    String taskId = taskModel.getTaskId();

                    db.collection("todoCollection")
                            .document(taskId)
                            .update("taskDone",isChecked);
                }
            });
우선, 데이터베이스에 있는 문서를 업데이트하기 위해 현재 항목의 위치를 가져옵니다.
집합에 대한 인용을 다시 가져와서document 방법에서 작업 id를 전달하여 문서 인용을 가져옵니다. 이 id는 문서 id입니다. Firebase 컨트롤러에서 집합을 열면 무작위 문자열이 문서 id로 표시됩니다.
이 ID를 taskId로 사용합니다.
문서에 대한 인용을 얻은 후, 우리는 업데이트 함수를 호출합니다. 첫 번째 매개 변수에서 업데이트할 필드 이름과 데이터베이스에 설정할 값을 전달합니다.
프로그램을 실행하고 체크 상자를 누르면firestore 데이터베이스에 있는 값이 업데이트됩니다.
이제 사용자가 작업을 삭제하려면 삭제 기능을 만듭니다.

FireStore 데이터베이스에서 문서 삭제


데이터베이스에서 문서를 삭제합니다.위에서 말한 바와 같이, 우리는 업데이트method라고 불리는 값을 업데이트했지만, 문서를 삭제하는 데 있어서, 문서 인용에 delete 방법을 호출하고, 작업 모델 목록에서 작업 모델을 삭제하고recyclerview를 업데이트하는 데 성공한 탐지기를 추가합니다.
deleteBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    final int currentPosition =  getAdapterPosition();
                    TaskModel taskModel = taskModelList.get(currentPosition);

                    String taskId = taskModel.getTaskId();

                    db.collection("todoCollection")
                            .document(taskId).delete()
                            .addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void aVoid) {
                                    taskModelList.remove(currentPosition);
                                    notifyDataSetChanged();
                                }
                            })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(context, "Failed to delete the task.", Toast.LENGTH_SHORT).show();
                        }
                    })
                    ;
                }
            });
작업을 삭제한 후, 어댑터에recyclerview를 업데이트하라고 알려야 합니다.그래서 notifyDataSetChanged 방법을 사용합니다.
현재, 우리는 어댑터 코드를 완성했습니다. 이제 어댑터를recyclerview에 연결합니다.activity 자바 파일로 이동하여 필요한 매개 변수로 어댑터 구조를 만들고layout 관리자를recyclerview로 설정하고 어댑터를recyclerview로 설정합니다.
그런 다음 모든 작업을 가져와 작업 모델로 변환하여 작업 모델 목록에 추가하고 어댑터 목록에 변경 사항을 알립니다.
db.collection("todoCollection")
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {

                        if(task.isSuccessful()){

                            for (QueryDocumentSnapshot document : task.getResult()) {
                                TaskModel taskModel = document.toObject(TaskModel.class);
                                taskModelList.add(taskModel);
                            }

                            adapter.notifyDataSetChanged();

                        }else{
                            Toast.makeText(MainActivity.this, "Error Getting task list.", Toast.LENGTH_SHORT).show();

                        }

                    }
                });
문서를 모델 대상으로 변환하려면 이 문서를 호출합니다.toObject 메서드를 사용하여 클래스를 전달합니다.이것은 작업의 대상을 되돌려주고 목록에 추가합니다.
순환이 끝난 후, 우리는 어댑터에 데이터를 변경할 것을 통지합니다.
응용 프로그램을 실행하고 새 작업을 추가하면recyclerview에 새 작업이 표시되지 않습니다. "추가"단추에서 "우리는 데이터베이스에만 추가"를 눌렀을 때 코드를 쓰지 않았기 때문입니다.recyclerview에 새 작업을 추가하려면 onClick 방법에서 다음 코드를 작성해야 합니다.
여기서 더 많은 글을 읽을 수 있습니다: How to use firestore in android studio

좋은 웹페이지 즐겨찾기