Cloud Firestore Tutorial
Introduction
Cloud Firestore is a flexible, scalable database for mobile, web, and server development from Firebase and Google Cloud Platform. It keeps your data in sync across client apps through real-time listeners and offers offline support for mobile and web so you can build responsive apps that work regardless of network latency or Internet connectivity.
Setting Up Cloud Firestore
To start using Cloud Firestore in your Android project, follow these steps:
Step 1: Add Firebase to Your Project
1. Open the Firebase Console: https://console.firebase.google.com/
2. Click on "Add project" and follow the instructions to create a new Firebase project.
3. In the Firebase console, add an Android app to your project by registering your app's package name.
Step 2: Add Firebase SDK to Your Project
1. Download the google-services.json
file and place it in the app/
directory of your Android project.
2. Add the Firebase SDK dependencies to your build.gradle
files:
// Project-level build.gradle buildscript { dependencies { // Add this line classpath 'com.google.gms:google-services:4.3.5' } }
// App-level build.gradle apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' dependencies { // Add these lines implementation 'com.google.firebase:firebase-analytics:18.0.2' implementation 'com.google.firebase:firebase-firestore:23.0.3' }
Basic CRUD Operations
Let's explore how to perform basic Create, Read, Update, and Delete operations in Cloud Firestore.
Create a Document
To create a document in Cloud Firestore, use the following code:
FirebaseFirestore db = FirebaseFirestore.getInstance(); Map<String, Object> user = new HashMap<>(); user.put("first", "Ada"); user.put("last", "Lovelace"); user.put("born", 1815); db.collection("users") .add(user) .addOnSuccessListener(new OnSuccessListener<DocumentReference>() { @Override public void onSuccess(DocumentReference documentReference) { Log.d(TAG, "DocumentSnapshot added with ID: " + documentReference.getId()); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.w(TAG, "Error adding document", e); } });
Read a Document
To read a document from Cloud Firestore:
DocumentReference docRef = db.collection("users").document("user_id"); docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() { @Override public void onComplete(@NonNull Task<DocumentSnapshot> task) { if (task.isSuccessful()) { DocumentSnapshot document = task.getResult(); if (document.exists()) { Log.d(TAG, "DocumentSnapshot data: " + document.getData()); } else { Log.d(TAG, "No such document"); } } else { Log.d(TAG, "get failed with ", task.getException()); } } });
Update a Document
To update a document in Cloud Firestore:
DocumentReference userRef = db.collection("users").document("user_id"); userRef.update("born", 1816) .addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { Log.d(TAG, "DocumentSnapshot successfully updated!"); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.w(TAG, "Error updating document", e); } });
Delete a Document
To delete a document in Cloud Firestore:
DocumentReference userRef = db.collection("users").document("user_id"); userRef.delete() .addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { Log.d(TAG, "DocumentSnapshot successfully deleted!"); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.w(TAG, "Error deleting document", e); } });
Using Queries
Firestore allows you to query your data in a variety of ways:
Simple Query
To retrieve documents based on a single field condition:
db.collection("users") .whereEqualTo("last", "Lovelace") .get() .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { for (DocumentSnapshot document : task.getResult()) { Log.d(TAG, document.getId() + " => " + document.getData()); } } else { Log.d(TAG, "Error getting documents: ", task.getException()); } } });
Compound Query
To retrieve documents based on multiple field conditions:
db.collection("users") .whereEqualTo("last", "Lovelace") .whereGreaterThan("born", 1800) .get() .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { for (DocumentSnapshot document : task.getResult()) { Log.d(TAG, document.getId() + " => " + document.getData()); } } else { Log.d(TAG, "Error getting documents: ", task.getException()); } } });
Real-time Updates
Firestore can listen to changes in your data in real-time:
DocumentReference docRef = db.collection("users").document("user_id"); docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() { @Override public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirebaseFirestoreException e) { if (e != null) { Log.w(TAG, "Listen failed.", e); return; } if (snapshot != null && snapshot.exists()) { Log.d(TAG, "Current data: " + snapshot.getData()); } else { Log.d(TAG, "Current data: null"); } } });
Conclusion
In this tutorial, we covered the basics of setting up Cloud Firestore in an Android project, performing CRUD operations, using queries, and listening to real-time updates. Cloud Firestore is a powerful tool that helps you build flexible and scalable applications.