Привет, мир, сегодня мы посмотрим, как мы можем создать приложение для задач, используя базу данных firebase cloud firestore. База данных Firestore – это очень гибкая и масштабируемая база данных NoSQL, позволяющая очень быстро разрабатывать нашу разработку.
Firestore очень прост в использовании в Android. FireStore может работать бесперебойно, даже если ваше устройство отключено, он может извлекать данные из кэша устройства, чтобы ваше приложение могло работать в автономном режиме и обновлять данные при повторном подключении к Интернету.
Это функционально делает ваше приложение интерактивным для пользователей.
В базе данных Firestore есть еще одна функция – следить за изменениями в базе данных в реальном времени, и вы можете показывать обновления в приложении.
База данных Firestore может выполнять запросы, чтобы вы могли фильтровать свои данные в соответствии с вашими требованиями, эта функция повышает вероятность выбора базы данных firestore для вашего проекта.
База данных Firestore хранит данные в документах, и эти документы сохраняются в коллекции. Думайте об этом так, как будто коллекция представляет собой папку с файлами, содержащую несколько документов, и в этих документах записаны некоторые данные.
Давайте проверим наше приложение, которое будет создаваться с использованием базы данных Firebase Cloud FireStore.
Давайте создадим наше приложение.
Создайте новый проект в консоли Firebase
Первым делом нам нужно создать новый проект в консоли firebase. Давайте отправимся в https://console .firebase.google.com/ и создайте новый проект, нажав на новый проект. Следуйте всем инструкциям.
После создания проекта давайте добавим наш проект для Android. Нажмите на значок Android.
а затем введите имя вашего пакета, а затем название приложения.
Скачайте google-сервисы.файл json и вставьте этот файл в папку приложения вашего приложения.
После этого следуйте инструкциям пожарной базы. Добавьте необходимые зависимости и нажмите кнопку синхронизации.
Ваши зависимости будут выглядеть так, как показано ниже.
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 файл
В приведенном выше коде мы добавили текст редактирования, кнопку и окно повторного использования.
добавьте нижеприведенную зависимость в файл build.gradle на уровне приложения, чтобы использовать recyclerview в проекте.
реализация “android.recyclerview:recyclerview:1.1.0”
Если вы хотите узнать больше о recyclerview вы можете проверить это здесь.
Теперь нам нужно создать макет элемента recyclerview .
Создайте новый файл макета и добавьте в него этот код.
В приведенном выше коде у нас есть флажок и изображение, которые действуют как кнопка удаления и устанавливают их соответствующие идентификаторы.
Если вы хотите добавить значок удаления в свой проект, вы можете легко добавить его, щелкнув правой кнопкой мыши папку для рисования, затем выберите “Создать”, а затем щелкните векторные ресурсы и в следующем окне выберите свой значок и имя значка, затем сохраните значок, и теперь вы можете использовать этот значок в imageview.
После всего этого мы добавим функциональность нашего приложения.
Перед созданием функциональности нам необходимо создать базу данных в консоли firebase. Перейдите в свой проект firebase и нажмите “Разработать”, выберите базу данных, а затем нажмите “Создать базу данных”.
Обратите внимание, что будет 2 варианта. Один для облачного хранилища FireStore, а в приведенном ниже втором варианте – для базы данных в реальном времени. Но нам нужно создать базу данных для облачного магазина FireStore.
Теперь нам нужно создать класс модели (класс объектов POJO), который будет использоваться в firebase и в recyclerview .
Создайте класс модели для Firebase и RecyclerView
Нам нужно создать класс модели, в котором будут храниться данные. Класс модели поможет установить данные и получить данные с помощью функций получения и установки. Мы должны указать тип данных и номер поля, которое мы хотим использовать. Смотрите приведенный ниже код, чтобы создать модель для приложения “Дела”.
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; } }
В приведенном выше классе модели, если вы заметили, мы используем аннотацию @, задокументированную над идентификатором задачи. В этой аннотации указано, что поле идентификатора задачи будет использоваться в качестве идентификатора документа документа firebase, и когда мы добавим данные в базу данных firestore, это свойство будет игнорироваться для создания в базе данных firestore. Если вы не понимаете, о чем я говорю, продолжайте читать, и вы поймете.
Затем мы создаем поле строки задачи для хранения значения задачи в виде строки, а последнее поле указывает, выполнена задача или нет. После этого мы создали метод getters и setters для установки значений и получения значений.
После создания модели мы перейдем к MainActivity.java и сделайте добавление данных в базу данных функциональным.
Добавьте данные в Firebase Firestore, используя класс модели
Чтобы добавить данные задачи в firestore, нам нужно получить значение задачи из edittext, и при нажатии кнопки мы проверим значение, если оно не пустое, а затем мы будем использовать функции 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() { @Override public void onSuccess(DocumentReference documentReference) { editTextTask.setText(null); } }); } }); }
В приведенном выше коде сначала мы создаем экземпляр базы данных firestore, а затем получаем ваш текст редактирования и кнопку из xml-макета activity в методе onCreate.
Затем мы реализуем прослушиватель нажатий на кнопку, и это добавит данные в базу данных firestore. В методе click сначала мы получаем строку из редактируемого текста, а затем проверяем, не пуста ли строка. Если строка пуста, то мы показываем тост, а затем возвращаемся из метода.
Затем мы создаем объект нашей модели задачи и устанавливаем значения с помощью методов setter. Мы устанавливаем значение task Done равным false и задаем строку задачи. Обратите внимание, что мы не устанавливаем идентификатор задачи так, как он будет обрабатываться библиотекой Firebase.
Теперь это тот момент, когда мы добавим данные в базу данных.
Сначала мы получаем ссылку на коллекцию с помощью метода db.collection, а затем вызываем метод add и передаем нашу модель, которую мы только что создали выше, а затем добавляем прослушиватель успеха.
В прослушивателе успеха мы удаляем строку из редактируемого текста.
Теперь, если вы запустите свое приложение, введите задачу в текст редактирования и нажмите кнопку добавить. Проверьте свою базу данных в консоли Firebase, в вашей коллекции будет только что созданный документ.
Обратите внимание, что коллекция создается автоматически, если она не существует.
Вот как мы добавляем данные в базу данных Firestore.
Теперь посмотрим, как мы можем получить данные из базы данных и показать в окне recyclerview.
Извлекать данные из базы данных Firestore и отображать в RecyclerView
Для отображения данных в recyclerview нам нужно создать класс адаптера для recyclerview, как мы делаем при реализации recyclerview. Итак, давайте создадим новый java-файл и расширим его до адаптера recyclerview.
Затем нам нужно передать ваш класс viewholder для этого мы создаем внутренний класс в нашем классе адаптера и передаем этот класс как универсальный в адаптере и реализуем все необходимые методы.
После создания всех классов нам нужно создать конструктор с параметрами. Этими параметрами являются Контекст, Список модели задачи и ссылка на БД.
Смотрите приведенный ниже код для лучшего понимания.
public class TaskAdapter extends RecyclerView.Adapter{ Context context; List taskModelList; FirebaseFirestore db; public TaskAdapter(Context context, List 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 () { @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() { @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_item.xml с флажком и изображением для кнопки удаления. Мы будем использовать эти элементы в держателе представления и создавать ссылки на них для работы с ними.
И в методе onBindViewHolder в адаптере. Мы устанавливаем текст флажка и его состояние проверки.
Теперь главное – обновить существующее значение задачи в базе данных. Мы хотим обновить значение выполненной задачи в базе данных, когда пользователь установит или снимет флажок. Мы должны добавить слушателя к этому в держателе просмотра.
Раздувать наши task_item.xml просмотр в onCreateViewHolder.
Смотрите также: Сделать Ночная тема в Android
Значение обновления в базе данных хранилища данных
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); } });
Сначала мы получаем текущую позицию элемента, а затем идентификатор задачи элемента для обновления документа в базе данных.
Снова мы получаем ссылку на коллекцию, затем получаем ссылку на документ, передавая идентификатор задачи в методе документа. Этот идентификатор является идентификатором документа. Если вы откроете свою коллекцию в консоли firebase, то в случайной строке будут показаны идентификаторы документов.
Мы используем эти идентификаторы в качестве идентификатора задачи.
После получения ссылки на документ мы вызываем функцию обновления и в первом параметре передаем имя поля, которое мы собираемся обновить, и значение, которое необходимо установить в базе данных.
Если вы запустите свое приложение и установите флажок, значение в базе данных firestore обновится.
Теперь, если пользователь хочет удалить задачу, давайте создадим функцию удаления.
Удалить документ из базы данных FireStore
Чтобы удалить документ из базы данных. Как мы делали выше, чтобы обновить значение, мы вызываем метод обновления, но для удаления документа мы вызовем метод удаления по ссылке на документ и добавим прослушиватель успеха, чтобы удалить модель задачи из списка моделей задач и обновить 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() { @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. Перейдите в свой java-файл activity и создайте конструктор адаптера с требуемыми параметрами, установите диспетчер компоновки в recyclerview и установите адаптер в recyclerview.
Затем мы извлекаем все задачи и преобразуем их в модель задач, добавляем их в список модели задач и уведомляем адаптер об изменении списка.
db.collection("todoCollection") .get() .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task 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(); } } });
Чтобы преобразовать документ в объект нашей модели, мы вызовем document.to Метод объекта и передать класс. Это вернет объект задачи и добавит этот объект в список.
После завершения цикла мы уведомляем адаптер об изменении данных.
Если вы запустите свое приложение на этом этапе и добавите новую задачу, то в вашем recyclerview не будет отображаться новая задача, так как вы не написали этот код при нажатии кнопки “Добавить”, которую мы добавили только для базы данных. Чтобы добавить новую задачу в recyclerview, нам нужно написать приведенный ниже код в методе Onclick.
Вы можете прочитать дополнительную статью здесь: Как использовать firestorm в android studio
Оригинал: “https://dev.to/akshayranagujjar/firebase-cloud-firestore-database-in-android-4l5f”