Créer une base de données Firestore à l'aide d'une bibliothèque cliente Web ou mobile
Dans ce guide de démarrage rapide, vous allez découvrir comment configurer Firestore, ajouter des données et lire des données à l'aide de la bibliothèque cliente Android, Plates-formes Apple, Web, Unity ou C++.
Créer une base de données Firestore
Si vous ne l’avez pas encore fait, créez un projet Firebase dans la console Firebase en cliquant sur Ajouter un projet, puis en suivant les instructions pour créer un nouveau projet Firebase ou pour ajouter les services Firebase à un projet GCP existant.
Dans le volet de navigation de la console Firebase, sélectionnez Firestore, puis cliquez sur Créer une base de données pour Firestore.
Pour les règles de sécurité Firestore, sélectionnez Mode test :
- Mode test
- Convient pour se familiariser avec les bibliothèques clientes mobiles et Web, mais permet à tout le monde de lire et d'écraser les données. Lorsque vous aurez terminé les tests, passez en revue la section Sécuriser les données.
Sélectionnez un emplacement pour la base de données.
Ce paramètre d'emplacement correspond à l'emplacement par défaut des ressources Google Cloud Platform (GCP) pour le projet. Cet emplacement sera utilisé pour les services GCP exploités dans le projet qui requièrent un paramètre d'emplacement, plus précisément le bucket Cloud Storage par défaut et l'application App Engine (qui est nécessaire si vous utilisez Cloud Scheduler).
Si vous ne parvenez pas à sélectionner un emplacement, c'est que votre projet dispose déjà d'un emplacement par défaut des ressources GCP. Il a été défini lors de la création du projet ou lors de la configuration d'un autre service nécessitant un paramètre d'emplacement.
Cliquez sur OK.
Lorsque vous activez Firestore, cela active également l'API dans Cloud API Manager.
Configurer l'environnement de développement
Ajoutez les dépendances et les bibliothèques clientes requises à votre application.
Version Web 9
- Suivez les instructions pour ajouter Firebase à votre application Web.
-
Importez à la fois Firebase et Firestore :
import { initializeApp } from "firebase/app"; import { getFirestore } from "firebase/firestore";
Version Web 8
- Suivez les instructions pour ajouter Firebase à votre application Web.
- Ajoutez les bibliothèques Firebase et Firestore à votre application :
Le SDK Firestore est également disponible en tant que package npm.<script src="https://www.gstatic.com/firebasejs/8.10.1/firebase-app.js"></script> <script src="https://www.gstatic.com/firebasejs/8.10.1/firebase-firestore.js"></script>
Vous devrez demander manuellement à la fois Firebase et Firestore.npm install firebase@8.10.1 --save
const firebase = require("firebase"); // Required for side-effects require("firebase/firestore");
Plates-formes Apple
Suivez les instructions pour ajouter Firebase à votre application Apple.
Utilisez Swift Package Manager pour installer et gérer les dépendances Firebase.
- Dans Xcode, à partir de votre projet d'application ouvert, accédez à File > Swift Packages > Add Package Dependency (Fichier > Packages Swift > Ajouter une dépendance de package).
- Lorsque vous y êtes invité, ajoutez le dépôt du SDK des plates-formes Firebase pour Apple :
- Choisissez la bibliothèque Firestore.
- Lorsque vous avez terminé, Xcode commence à résoudre et à télécharger automatiquement vos dépendances en arrière-plan.
https://github.com/firebase/firebase-ios-sdk
Android
- Suivez les instructions pour ajouter Firebase à votre application Android.
- Déclarer la dépendance pour la bibliothèque Firestore pour Android
dans le fichier Gradle de votre module (au niveau de l'application) (généralement
app/build.gradle.kts
ouapp/build.gradle
):implementation("com.google.firebase:firebase-firestore:25.1.0")
Si votre application utilise plusieurs bibliothèques Firebase, nous vous conseillons d'utiliser la nomenclature (BoM) Firebase Android, qui garantit que les versions de la bibliothèque Firebase de votre application sont toujours compatibles.
Vous recherchez un module de bibliothèque spécifique à Kotlin ? En commençant par Version d'octobre 2023, Les développeurs Kotlin et Java peuvent dépendre du module de la bibliothèque principale Pour en savoir plus, consultez les questions fréquentes sur cette initiative).
Dart
- Si vous ne l'avez pas déjà fait, configurez et initialiser Firebase dans votre application Flutter.
- Depuis la racine de votre projet Flutter, exécutez la commande suivante pour :
Installez le plug-in:
flutter pub add cloud_firestore
- Une fois l'opération terminée, recompilez votre application Flutter:
flutter run
C++
- Suivez les instructions pour ajouter Firebase à votre projet C++.
- Interface C++ pour Android.
- Dépendances Gradle. Ajoutez les éléments suivants à votre fichier Gradle (généralement
app/build.gradle
) de votre module (au niveau de l'application) :android.defaultConfig.externalNativeBuild.cmake { arguments "-DFIREBASE_CPP_SDK_DIR=$gradle.firebase_cpp_sdk_dir" } apply from: "$gradle.firebase_cpp_sdk_dir/Android/firebase_dependencies.gradle" firebaseCpp.dependencies { // earlier entries auth firestore }
- Dépendances binaires. De même, la méthode recommandée pour obtenir les dépendances binaires consiste à ajouter ce qui suit à votre fichier
CMakeLists.txt
:add_subdirectory(${FIREBASE_CPP_SDK_DIR} bin/ EXCLUDE_FROM_ALL) set(firebase_libs firebase_auth firebase_firestore firebase_app) # Replace the target name below with the actual name of your target, # for example, "native-lib". target_link_libraries(${YOUR_TARGET_NAME_HERE} "${firebase_libs}")
- Pour configurer l'intégration au bureau, consultez la section Ajouter Firebase à votre projet C++.
Unity
- Suivez les instructions pour ajouter Firebase à votre projet Unity.
- Utilisez l'interface Unity pour configurer votre projet afin de réduire la taille des builds Android.
- Cette option se trouve dans Player Settings > Android > Publication... Paramètres > Réduire la taille :
- Les options peuvent varier selon les versions d'Unity. Consultez donc la documentation officielle d'Unity et le guide de débogage de la compilation Firebase Unity.
-
Si, après avoir activé la minimisation, le nombre de méthodes référencées reste
dépasse la limite, vous pouvez également activer
multidex
dans:-
mainTemplate.gradle
si l'option Custom Gradle Template (Modèle Gradle personnalisé) est activée sous Player Settings (Paramètres du lecteur) -
ou le fichier
build.gradle
au niveau du module si vous utilisez Android Studio pour compiler le projet exporté.
-
Vous devez réduire la taille de la compilation pour éviter le message Error while merging dex archives
.
Initialiser Firestore
Initialiser une instance de Firestore :
Version Web 9
// Initialize Firestore through Firebase import { initializeApp } from "firebase/app" import { getFirestore } from "firebase/firestore" const firebaseApp = initializeApp({ apiKey: '### FIREBASE API KEY ###', authDomain: '### FIREBASE AUTH DOMAIN ###', projectId: '### CLOUD FIRESTORE PROJECT ID ###' }); const db = getFirestore();
Version Web 8
// Initialize Firestore through Firebase firebase.initializeApp({ apiKey: '### FIREBASE API KEY ###', authDomain: '### FIREBASE AUTH DOMAIN ###', projectId: '### CLOUD FIRESTORE PROJECT ID ###' }); var db = firebase.firestore();
Swift
import FirebaseCore import FirebaseFirestore FirebaseApp.configure() let db = Firestore.firestore()
Objective-C
@import FirebaseCore; @import FirebaseFirestore; // Use Firebase library to configure APIs [FIRApp configure]; FIRFirestore *defaultFirestore = [FIRFirestore firestore];
Kotlin + KTX
Android
// Access a Firestore instance from your Activity val db = Firebase.firestore
Java
Android
// Access a Firestore instance from your Activity FirebaseFirestore db = FirebaseFirestore.getInstance();
Dart
db = FirebaseFirestore.instance;
C++
// Make sure the call to `Create()` happens some time before you call Firestore::GetInstance(). App::Create(); Firestore* db = Firestore::GetInstance();
Unity
using Firebase.Firestore; using Firebase.Extensions;
FirebaseFirestore db = FirebaseFirestore.DefaultInstance;
Ajouter des données
Firestore stocke les données dans des documents, qui sont eux-mêmes stockés dans des collections. Firestore crée implicitement les collections et les documents nécessaires la première fois qu’une donnée est ajoutée à un document. Vous n'avez pas besoin de créer explicitement les collections ni les documents.
Créez une collection et un document à l'aide de l'exemple de code ci-dessous.
Version Web 9
import { collection, addDoc } from "firebase/firestore"; try { const docRef = await addDoc(collection(db, "users"), { first: "Ada", last: "Lovelace", born: 1815 }); console.log("Document written with ID: ", docRef.id); } catch (e) { console.error("Error adding document: ", e); }
Version Web 8
db.collection("users").add({ first: "Ada", last: "Lovelace", born: 1815 }) .then((docRef) => { console.log("Document written with ID: ", docRef.id); }) .catch((error) => { console.error("Error adding document: ", error); });
Swift
// Add a new document with a generated ID do { let ref = try await db.collection("users").addDocument(data: [ "first": "Ada", "last": "Lovelace", "born": 1815 ]) print("Document added with ID: \(ref.documentID)") } catch { print("Error adding document: \(error)") }
Objective-C
// Add a new document with a generated ID __block FIRDocumentReference *ref = [[self.db collectionWithPath:@"users"] addDocumentWithData:@{ @"first": @"Ada", @"last": @"Lovelace", @"born": @1815 } completion:^(NSError * _Nullable error) { if (error != nil) { NSLog(@"Error adding document: %@", error); } else { NSLog(@"Document added with ID: %@", ref.documentID); } }];
Kotlin + KTX
Android
// Create a new user with a first and last name val user = hashMapOf( "first" to "Ada", "last" to "Lovelace", "born" to 1815, ) // Add a new document with a generated ID db.collection("users") .add(user) .addOnSuccessListener { documentReference -> Log.d(TAG, "DocumentSnapshot added with ID: ${documentReference.id}") } .addOnFailureListener { e -> Log.w(TAG, "Error adding document", e) }
Java
Android
// Create a new user with a first and last name Map<String, Object> user = new HashMap<>(); user.put("first", "Ada"); user.put("last", "Lovelace"); user.put("born", 1815); // Add a new document with a generated ID 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); } });
Dart
// Create a new user with a first and last name final user = <String, dynamic>{ "first": "Ada", "last": "Lovelace", "born": 1815 }; // Add a new document with a generated ID db.collection("users").add(user).then((DocumentReference doc) => print('DocumentSnapshot added with ID: ${doc.id}'));
C++
// Add a new document with a generated ID Future<DocumentReference> user_ref = db->Collection("users").Add({{"first", FieldValue::String("Ada")}, {"last", FieldValue::String("Lovelace")}, {"born", FieldValue::Integer(1815)}}); user_ref.OnCompletion([](const Future<DocumentReference>& future) { if (future.error() == Error::kErrorOk) { std::cout << "DocumentSnapshot added with ID: " << future.result()->id() << std::endl; } else { std::cout << "Error adding document: " << future.error_message() << std::endl; } });
Unity
DocumentReference docRef = db.Collection("users").Document("alovelace"); Dictionary<string, object> user = new Dictionary<string, object> { { "First", "Ada" }, { "Last", "Lovelace" }, { "Born", 1815 }, }; docRef.SetAsync(user).ContinueWithOnMainThread(task => { Debug.Log("Added data to the alovelace document in the users collection."); });
À présent, ajoutez un autre document à la collection users
. Notez que ce document contient une paire clé-valeur (deuxième prénom) qui n'est pas présente dans le premier document. Les documents d'une collection peuvent contenir différents ensembles d'informations.
Version Web 9
// Add a second document with a generated ID. import { addDoc, collection } from "firebase/firestore"; try { const docRef = await addDoc(collection(db, "users"), { first: "Alan", middle: "Mathison", last: "Turing", born: 1912 }); console.log("Document written with ID: ", docRef.id); } catch (e) { console.error("Error adding document: ", e); }
Version Web 8
// Add a second document with a generated ID. db.collection("users").add({ first: "Alan", middle: "Mathison", last: "Turing", born: 1912 }) .then((docRef) => { console.log("Document written with ID: ", docRef.id); }) .catch((error) => { console.error("Error adding document: ", error); });
Swift
// Add a second document with a generated ID. do { let ref = try await db.collection("users").addDocument(data: [ "first": "Alan", "middle": "Mathison", "last": "Turing", "born": 1912 ]) print("Document added with ID: \(ref.documentID)") } catch { print("Error adding document: \(error)") }
Objective-C
// Add a second document with a generated ID. __block FIRDocumentReference *ref = [[self.db collectionWithPath:@"users"] addDocumentWithData:@{ @"first": @"Alan", @"middle": @"Mathison", @"last": @"Turing", @"born": @1912 } completion:^(NSError * _Nullable error) { if (error != nil) { NSLog(@"Error adding document: %@", error); } else { NSLog(@"Document added with ID: %@", ref.documentID); } }];
Kotlin + KTX
Android
// Create a new user with a first, middle, and last name val user = hashMapOf( "first" to "Alan", "middle" to "Mathison", "last" to "Turing", "born" to 1912, ) // Add a new document with a generated ID db.collection("users") .add(user) .addOnSuccessListener { documentReference -> Log.d(TAG, "DocumentSnapshot added with ID: ${documentReference.id}") } .addOnFailureListener { e -> Log.w(TAG, "Error adding document", e) }
Java
Android
// Create a new user with a first, middle, and last name Map<String, Object> user = new HashMap<>(); user.put("first", "Alan"); user.put("middle", "Mathison"); user.put("last", "Turing"); user.put("born", 1912); // Add a new document with a generated ID 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); } });
Dart
// Create a new user with a first and last name final user = <String, dynamic>{ "first": "Alan", "middle": "Mathison", "last": "Turing", "born": 1912 }; // Add a new document with a generated ID db.collection("users").add(user).then((DocumentReference doc) => print('DocumentSnapshot added with ID: ${doc.id}'));
C++
db->Collection("users") .Add({{"first", FieldValue::String("Alan")}, {"middle", FieldValue::String("Mathison")}, {"last", FieldValue::String("Turing")}, {"born", FieldValue::Integer(1912)}}) .OnCompletion([](const Future<DocumentReference>& future) { if (future.error() == Error::kErrorOk) { std::cout << "DocumentSnapshot added with ID: " << future.result()->id() << std::endl; } else { std::cout << "Error adding document: " << future.error_message() << std::endl; } });
Unity
DocumentReference docRef = db.Collection("users").Document("aturing"); Dictionary<string, object> user = new Dictionary<string, object> { { "First", "Alan" }, { "Middle", "Mathison" }, { "Last", "Turing" }, { "Born", 1912 } }; docRef.SetAsync(user).ContinueWithOnMainThread(task => { Debug.Log("Added data to the aturing document in the users collection."); });
Lire des données
Utilisez la visionneuse de données de la console Firebase pour vérifier rapidement que vous avez bien ajouté des données à Firestore.
Vous pouvez également utiliser la méthode get
pour récupérer l'ensemble de la collection.
Version Web 9
import { collection, getDocs } from "firebase/firestore"; const querySnapshot = await getDocs(collection(db, "users")); querySnapshot.forEach((doc) => { console.log(`${doc.id} => ${doc.data()}`); });
Version Web 8
db.collection("users").get().then((querySnapshot) => { querySnapshot.forEach((doc) => { console.log(`${doc.id} => ${doc.data()}`); }); });
Swift
do { let snapshot = try await db.collection("users").getDocuments() for document in snapshot.documents { print("\(document.documentID) => \(document.data())") } } catch { print("Error getting documents: \(error)") }
Objective-C
[[self.db collectionWithPath:@"users"] getDocumentsWithCompletion:^(FIRQuerySnapshot * _Nullable snapshot, NSError * _Nullable error) { if (error != nil) { NSLog(@"Error getting documents: %@", error); } else { for (FIRDocumentSnapshot *document in snapshot.documents) { NSLog(@"%@ => %@", document.documentID, document.data); } } }];
Kotlin + KTX
Android
db.collection("users") .get() .addOnSuccessListener { result -> for (document in result) { Log.d(TAG, "${document.id} => ${document.data}") } } .addOnFailureListener { exception -> Log.w(TAG, "Error getting documents.", exception) }
Java
Android
db.collection("users") .get() .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { for (QueryDocumentSnapshot document : task.getResult()) { Log.d(TAG, document.getId() + " => " + document.getData()); } } else { Log.w(TAG, "Error getting documents.", task.getException()); } } });
Dart
await db.collection("users").get().then((event) { for (var doc in event.docs) { print("${doc.id} => ${doc.data()}"); } });
C++
Future<QuerySnapshot> users = db->Collection("users").Get(); users.OnCompletion([](const Future<QuerySnapshot>& future) { if (future.error() == Error::kErrorOk) { for (const DocumentSnapshot& document : future.result()->documents()) { std::cout << document << std::endl; } } else { std::cout << "Error getting documents: " << future.error_message() << std::endl; } });
Unity
CollectionReference usersRef = db.Collection("users"); usersRef.GetSnapshotAsync().ContinueWithOnMainThread(task => { QuerySnapshot snapshot = task.Result; foreach (DocumentSnapshot document in snapshot.Documents) { Debug.Log(String.Format("User: {0}", document.Id)); Dictionary<string, object> documentDictionary = document.ToDictionary(); Debug.Log(String.Format("First: {0}", documentDictionary["First"])); if (documentDictionary.ContainsKey("Middle")) { Debug.Log(String.Format("Middle: {0}", documentDictionary["Middle"])); } Debug.Log(String.Format("Last: {0}", documentDictionary["Last"])); Debug.Log(String.Format("Born: {0}", documentDictionary["Born"])); } Debug.Log("Read all data from the users collection."); });
Sécuriser vos données
Utilisez Firebase Authentication et les règles de sécurité Firestore pour sécuriser vos données dans Firestore.
Voici quelques règles de base qui vous aideront à bien démarrer. Vous pouvez modifier les règles de sécurité de votre projet dans l'onglet Règles de la console Firebase.
Authentification requise
// Allow read/write access on all documents to any user signed in to the application
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
Mode verrouillé
// Deny read/write access to all users under any conditions
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
Mode test
// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this rule set in production; it allows
// anyone to overwrite your entire database.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}
Avant de déployer votre application Web, Android ou iOS en production, prenez également les mesures nécessaires pour vous assurer que seuls les clients de votre application peuvent accéder à vos données Firestore. Consultez la documentation sur App Check.
Regarder·un tutoriel vidéo
Pour obtenir des conseils précis sur les bibliothèques clientes mobiles et Web Firestore, regardez l'un des tutoriels vidéos ci-dessous :
Web
iOS
Android
Vous trouverez d'autres vidéos sur la chaîne YouTube de Firebase.
Étapes suivantes
Approfondissez vos connaissances sur les sujets suivants :
- Codelabs : découvrez comment utiliser Firestore dans une application réelle en suivant le codelab pour Android, iOS ou Web.
- Modèle de données : apprenez comment les données sont structurées dans Firestore, y compris les données hiérarchiques et les sous-collections.
- Ajouter des données : en savoir plus sur la création et la mise à jour de données dans Firestore.
- Obtenir des données : en savoir plus sur la récupération des données.
- Lancer des requêtes simples et des requêtes composées : en savoir plus sur l’exécution des requêtes simples et composées.
- Tris et limites dans les requêtes : découvrez comment trier et limiter les données renvoyées par les requêtes.