Crea un database Firestore utilizzando una libreria client per mobile o web
Questa guida rapida mostra come configurare Firestore, aggiungere dati e leggere dati utilizzando la libreria client di Android, delle piattaforme Apple, del web, di Unity o di C++.
Se non l'hai ancora fatto, crea un progetto Firebase: nella console Firebase, fai clic su Aggiungi progetto, quindi segui le istruzioni sullo schermo per creare un progetto Firebase o per aggiungere i servizi Firebase a un Google Cloud progetto esistente.
Apri il tuo progetto nella console Firebase. Nel riquadro a sinistra, espandi Crea e seleziona Database Firestore.
Fai clic su Crea database.
Seleziona una località per il tuo database.
Se non riesci a selezionare una località, significa che la "località per le risorse predefinite" del tuo progetto è già stata impostata. Google Cloud Alcune risorse del tuo progetto (come l'istanza Firestore predefinita) condividono una dipendenza di località comune e la loro località può essere impostata durante la creazione del progetto o durante la configurazione di un altro servizio che condivide questa dipendenza di località.
Seleziona una modalità di avvio per le regole di sicurezza di Firestore:
- Modalità di prova
Ideale per iniziare a utilizzare le librerie client per mobile e web, ma consente a chiunque di leggere e sovrascrivere i tuoi dati. Dopo il test, assicurati di esaminare la sezione Proteggi i tuoi dati.
Per iniziare a utilizzare l'SDK web, delle piattaforme Apple o l'SDK Android, seleziona la modalità di prova.
- Modalità di blocco
Nega tutte le operazioni di lettura e scrittura dei client web e su dispositivi mobili. I server delle applicazioni autenticati (C#, Go, Java, Node.js, PHP, Python o Ruby) possono comunque accedere al tuo database.
Per iniziare a utilizzare la libreria client server C#, Go, Java, Node.js, PHP, Python o Ruby, seleziona la modalità di blocco.
Il set iniziale di regole di sicurezza di Firestore verrà applicato al database Firestore predefinito. Se crei più database per il tuo progetto, puoi eseguire il deployment delle regole di sicurezza di Firestore per ogni database.
Fai clic su Crea.
Quando abiliti Firestore, viene abilitata anche l'API in the Cloud API Manager.
Configurazione dell'ambiente di sviluppo
Aggiungi le dipendenze e le librerie client necessarie alla tua app.
Web versione 9
- Segui le istruzioni per aggiungere Firebase alla tua app web.
-
Importa sia Firebase sia Firestore:
import { initializeApp } from "firebase/app"; import { getFirestore } from "firebase/firestore";
Web versione 8
- Segui le istruzioni per aggiungere 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 > Swift Packages > Add Package Dependency (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 a scaricare le tue dipendenze in background.
https://github.com/firebase/firebase-ios-sdk
Android
- Segui le istruzioni per aggiungere Firebase alla tua app per Android.
- Dichiara la dipendenza per la libreria Firestore per Android
nel file Gradle (a livello di app) del modulo (solitamente
app/build.gradle.ktsoapp/build.gradle):implementation("com.google.firebase:firebase-firestore:26.3.0")
Se la tua app utilizza più librerie Firebase, valuta la possibilità di utilizzare la distinta base di Firebase Android, che garantisce che le versioni delle librerie Firebase della tua app siano sempre compatibili.
Cerchi un modulo di libreria specifico per Kotlin? A partire dalla release di ottobre 2023, gli sviluppatori Kotlin e Java possono dipendere dal modulo della libreria principale (per i dettagli, consulta le Domande frequenti su questa iniziativa).
Dart
- Se non l'hai ancora fatto, configura e inizializza Firebase nella tua app Flutter.
- Dalla directory principale del progetto Flutter, esegui il seguente comando per
installare il plug-in:
flutter pub add cloud_firestore
- Al termine, ricompila 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 (solitamente
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. Allo stesso modo, il modo consigliato per ottenere
le dipendenze binarie è aggiungere quanto segue al 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 tuo progetto C++.
Unity
- Segui le istruzioni per aggiungere Firebase al tuo progetto Unity.
- Utilizza l'interfaccia Unity per configurare il progetto in modo da ridurre le build Android.
- L'opzione è disponibile in Player Settings > Android > Publishing Settings > Minify (Impostazioni giocatore > Android > Impostazioni di pubblicazione > Riduci).
- Le opzioni possono variare nelle diverse versioni di Unity, quindi consulta la documentazione ufficiale di Unity e la Guida al debug della build di Firebase Unity.
-
Se, dopo aver abilitato la riduzione, il numero di metodi a cui viene fatto riferimento supera ancora il limite, un'altra opzione è abilitare
multidexin:-
mainTemplate.gradlese Custom Gradle Template (Modello Gradle personalizzato) in Player Settings (Impostazioni giocatore) è abilitato -
o il file
build.gradlea livello di modulo, se utilizzi Android Studio per creare il progetto esportato.
-
Devi ridurre la build per evitare il messaggio Error while merging dex archives.
Inizializza Firestore in modalità Native
Inizializza un'istanza di Firestore:
Web versione 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();
Web versione 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
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 in documenti, che vengono archiviati in raccolte. Firestore crea raccolte e documenti in modo implicito la prima volta che aggiungi dati al documento. Non è necessario creare esplicitamente raccolte o documenti.
Crea una nuova raccolta e un documento utilizzando il seguente codice di esempio.
Web versione 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); }
Web versione 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
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 (secondo nome) che non è presente nel primo documento. I documenti in una raccolta possono contenere diversi set di informazioni.
Web versione 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); }
Web versione 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
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 di dati nella console Firebase per verificare rapidamente di aver aggiunto dati a Firestore.
Puoi anche utilizzare il metodo get per recuperare l'intera raccolta.
Web versione 9
import { collection, getDocs } from "firebase/firestore"; const querySnapshot = await getDocs(collection(db, "users")); querySnapshot.forEach((doc) => { console.log(`${doc.id} => ${doc.data()}`); });
Web versione 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
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 le regole di sicurezza di Firestore per proteggere i tuoi dati in Firestore in modalità Native.
Ecco alcuni set di regole di base che puoi utilizzare per iniziare. Puoi modificare le tue regole di sicurezza nella scheda Regole della console Firebase.
Autenticazione obbligatoria
// 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 prova
// 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 dell'app web, Android o iOS in produzione, adotta anche misure per assicurarti che solo i client della tua app possano accedere ai dati di Firestore in modalità Native. Consulta la documentazione di App Check.
Guarda un video tutorial
Per indicazioni dettagliate su come iniziare a utilizzare le librerie client per mobile e web di Firestore, guarda uno dei seguenti video tutorial:
Web
iOS
Android
Puoi trovare altri video nel canale YouTube di Firebase.
Passaggi successivi
Approfondisci le tue conoscenze con i seguenti argomenti:
- Codelab : scopri come utilizzare Firestore in modalità Native in un'app reale seguendo il codelab per Android, iOS o web.
- Modello di dati : scopri di più su come i dati sono strutturati in Firestore, inclusi i dati gerarchici e le sottoraccolte.
- Aggiungi dati : scopri di più sulla creazione e sull'aggiornamento dei dati in Firestore.
- Recupera dati : scopri di più su come recuperare i dati.
- Esegui query semplici e composte : scopri come eseguire query semplici e composte.
- Ordina e limita le query : scopri come ordinare e limitare i dati restituiti dalle query.