Crea un database Firestore utilizzando una libreria client web o mobile
Questa guida rapida mostra come configurare Firestore, aggiungere dati e leggere dati utilizzando la libreria client per Android, piattaforme Apple, web, Unity o C++.
Creare un database Firestore
Se non lo hai già fatto, crea un progetto Firebase: Console Firebase, fai clic su Aggiungi progetto. e poi segui le istruzioni sullo schermo per creare un progetto Firebase o aggiungere servizi Firebase a un progetto Google Cloud esistente.
Nel riquadro di navigazione della console Firebase, seleziona Firestore, quindi fai clic su Crea database per Firestore.
Seleziona Modalità di test per le regole di sicurezza di Firestore:
- Modalità di test
- È ideale per iniziare a usare le librerie client web e per dispositivi mobili, ma consente a chiunque di leggere e sovrascrivere i tuoi dati. Dopo il test, effettua assicurati di rivedere la sezione Proteggere i tuoi dati.
Seleziona una località per il tuo database.
Questa impostazione di geolocalizzazione corrisponde a quella del progetto località predefinita delle risorse Google Cloud. Tieni presente che questa località verrà utilizzata per i servizi Google Cloud nel tuo progetto che richiedono un'impostazione di località, in particolare il bucket Cloud Storage predefinito e l'app App Engine (obbligatoria se utilizzi Cloud Scheduler).
Se non riesci a selezionare una località, significa che il tuo progetto ha già una località predefinita per le risorse Google Cloud. È stata impostata durante la creazione del progetto o durante la configurazione di un altro servizio che richiede l'impostazione della località.
Fai clic su Fine.
Quando attivi Firestore, viene attivata anche l'API in Cloud API Manager.
Configurazione dell'ambiente di sviluppo
Aggiungi le dipendenze e le librerie client necessarie alla tua app.
Versione web 9
- Segui le istruzioni per aggiungi Firebase alla tua app web.
-
Importa sia Firebase sia Firestore:
import { initializeApp } from "firebase/app"; import { getFirestore } from "firebase/firestore";
Versione web 8
- Segui le istruzioni per aggiungi Firebase alla tua app web.
- Aggiungi le librerie Firebase e Firestore alla tua app:
L'SDK Firestore è disponibile anche come pacchetto 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>
Dovrai richiedere manualmente sia Firebase sia Firestore.npm install firebase@8.10.1 --save
const firebase = require("firebase"); // Required for side-effects require("firebase/firestore");
Piattaforme Apple
Segui le istruzioni per aggiungere Firebase alla tua app Apple.
Utilizza Swift Package Manager per installare e gestire le dipendenze di Firebase.
- In Xcode, con il progetto dell'app aperto, vai a File > Pacchetti Swift > Aggiungi dipendenza pacchetto.
- Quando richiesto, aggiungi il repository dell'SDK delle piattaforme Apple di Firebase:
- Scegli la libreria Firestore.
- Al termine, Xcode inizierà automaticamente a risolvere e scaricare il le dipendenze in background.
https://github.com/firebase/firebase-ios-sdk
Android
- Segui le istruzioni per aggiungere Firebase alla tua app Android.
- Dichiara la dipendenza per la libreria Firestore per Android
nel file Gradle del modulo (a livello di app) (di solito
app/build.gradle.kts
oapp/build.gradle
):implementation("com.google.firebase:firebase-firestore:25.1.0")
Se la tua app utilizza più librerie Firebase, ti consigliamo di utilizzare la disponibile, che garantisce che le versioni delle librerie Firebase della tua app siano sempre compatibili.
Cerchi un modulo della libreria specifico per Kotlin? A partire dal Release di ottobre 2023, gli sviluppatori Kotlin e Java possono dipendere dal modulo della libreria principale (per i dettagli, consulta Domande frequenti su questa iniziativa).
Dart
- Se non lo hai già fatto, configura e inizializza Firebase nell'app Flutter.
- Dalla radice del progetto Flutter, esegui questo comando:
Installa il plug-in:
flutter pub add cloud_firestore
- Al termine, ricostruisci l'applicazione Flutter:
flutter run
C++
- Segui le istruzioni per aggiungere Firebase al tuo progetto C++.
- Interfaccia C++ per Android.
- Dipendenze Gradle. Aggiungi quanto segue al file Gradle
(a livello di app) del modulo (di solito
app/build.gradle
):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 }
- Dipendenze binarie. Analogamente, il modo consigliato per ottenere
le dipendenze binarie è aggiungere quanto segue al tuo file
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}")
- Per configurare l'integrazione desktop, consulta Aggiungere Firebase al progetto C++.
Unity
- Segui le istruzioni per aggiungi Firebase al tuo account Unity progetto.
- Utilizza l'interfaccia di Unity per configurare il progetto in modo da ridurre al minimo le build Android.
- L'opzione è disponibile in Impostazioni del player > Android > Pubblicazione in corso... Impostazioni > Minimizza.
- Le opzioni possono variare in base alle versioni di Unity, quindi consulta la documentazione ufficiale di Unity e la guida alla debug di Firebase Unity Build.
-
Se, dopo aver abilitato la minimizzazione, il numero di metodi a cui viene fatto riferimento
supera il limite, un'altra opzione è attivare
multidex
in:-
mainTemplate.gradle
se l'opzione Modello Gradle personalizzato in Impostazioni del player è abilitata -
In alternativa, il file
build.gradle
a livello di modulo, se utilizzi Android Studio per compilare il progetto esportato.
-
Devi minimizzare la build per evitare il messaggio Error while merging dex archives
.
Inizializza Firestore
Inizializza un'istanza di Firestore:
Versione 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();
Versione 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;
Aggiungi dati
Firestore archivia i dati nei documenti, che sono archiviati nelle raccolte. Firestore crea raccolte e documenti in modo implicito la prima volta che aggiungi dati al documento. Non è necessario specificare creare raccolte o documenti.
Crea una nuova raccolta e un nuovo documento utilizzando il seguente codice di esempio.
Versione 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); }
Versione 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."); });
Ora aggiungi un altro documento alla raccolta users
. Tieni presente che questo documento include una coppia chiave-valore (nome intermedio) che non compare nel primo documento. I documenti di una raccolta possono contenere diversi insiemi di informazioni.
Versione 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); }
Versione 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."); });
Lettura di dati
Utilizza il visualizzatore dei dati nella Console Firebase per verificare rapidamente di aver aggiunto dati a Firestore.
Puoi anche utilizzare il metodo get
per recuperare l'intera raccolta.
Versione web 9
import { collection, getDocs } from "firebase/firestore"; const querySnapshot = await getDocs(collection(db, "users")); querySnapshot.forEach((doc) => { console.log(`${doc.id} => ${doc.data()}`); });
Versione 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."); });
Proteggi i tuoi dati
Utilizza Firebase Authentication e Regole di sicurezza di Firestore per la protezione dei dati in Firestore
Ecco alcuni insiemi di regole di base che puoi utilizzare per iniziare. Puoi modificare le tue regole di sicurezza nella scheda Regole della console Firebase.
Autenticazione richiesta
// 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;
}
}
}
Modalità di blocco
// Deny read/write access to all users under any conditions
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
Modalità di 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;
}
}
}
Prima di eseguire il deployment della tua app web, Android o per iOS in produzione, segui alcuni passaggi per assicurarti che solo i client delle tue app possano accedere ai dati Firestore. Consulta la documentazione di App Check.
Guarda un tutorial video
Per indicazioni dettagliate su come iniziare a utilizzare Firestore librerie client web e per dispositivi mobili, guarda uno dei seguenti tutorial video:
Web
iOS
Android
Puoi trovare altri video in Firebase Canale YouTube.
Passaggi successivi
Approfondisci le tue conoscenze con i seguenti argomenti:
- Codelab. Scopri come utilizzare Firestore in un'app reale seguire il codelab per Android, iOS Web.
- Modello di dati: scopri di più su come vengono strutturati i dati in Firestore, inclusi i dati gerarchici e le sottocollezioni.
- Aggiungi dati: scopri di più sulla creazione e sull'aggiornamento dei dati in Firestore.
- Ottieni i dati: scopri di più su come recuperare i dati.
- Esecuzione di query semplici e composte: scopri come eseguire query semplici e composte.
- Query relative a un ordine e a una limitazione: scopri come effettuare un ordine e limitare i dati restituiti dalle query.