Creare 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++.

  1. 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 progetto Google Cloud esistente.

  2. Apri il progetto nella Console Firebase. Nel riquadro a sinistra, espandi Compilazione e seleziona Database Firestore.

  3. Fai clic su Crea database.

  4. Seleziona una località per il tuo database.

    Se non riesci a selezionare una località, significa che la "località per le risorse Google Cloud predefinite" del progetto è già stata impostata. Alcune risorse del progetto (ad esempio l'istanza Firestore predefinita) condividono una dipendenza dalla località comune e la loro posizione può essere impostata durante la creazione del progetto o durante la configurazione di un altro servizio che condivide questa dipendenza dalla località.

  5. Seleziona una modalità iniziale per le regole di sicurezza Firestore:

    Modalità di test

    Ottima per iniziare a utilizzare le librerie client mobile e web, ma consente a chiunque di leggere e sovrascrivere i tuoi dati. Dopo il test, assicurati di leggere la sezione Proteggere i dati.

    Per iniziare a utilizzare il web, le piattaforme Apple o l'SDK Android, seleziona la modalità di test.

    Modalità di blocco

    Rifiuta tutte le letture e le scritture dai client web e mobile. I server delle applicazioni autenticati (C#, Go, Java, Node.js, PHP, Python o Ruby) possono comunque accedere al database.

    Per iniziare a utilizzare la libreria client server di C#, Go, Java, Node.js, PHP, Python o Ruby, seleziona la modalità bloccata.

    Il set iniziale di regole di sicurezza di Firestore verrà applicato al database Firestore predefinito. Se crei più database per il tuo progetto, puoi implementare le regole di sicurezza di Firestore per ogni database.

  6. Fai clic su Crea.

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

  1. Segui le istruzioni per aggiungere Firebase alla tua app web.
  2. Importa sia Firebase sia Firestore:
    import { initializeApp } from "firebase/app";
    import { getFirestore } from "firebase/firestore";

Versione web 8

  1. Segui le istruzioni per aggiungere Firebase alla tua app web.
  2. Aggiungi le librerie Firebase e Firestore alla tua app:
    <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>
    L'SDK Firestore è disponibile anche come pacchetto npm.
    npm install firebase@8.10.1 --save
    Dovrai richiedere manualmente sia Firebase sia Firestore.
    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.

  1. In Xcode, con il progetto dell'app aperto, vai a File > Pacchetti Swift > Aggiungi dipendenza pacchetto.
  2. Quando richiesto, aggiungi il repository dell'SDK delle piattaforme Apple di Firebase:
  3.   https://github.com/firebase/firebase-ios-sdk
      
  4. Scegli la libreria Firestore.
  5. Al termine, Xcode inizierà automaticamente a risolvere e a scaricare le tue dipendenze in background.
Android
  1. Segui le istruzioni per aggiungere Firebase alla tua app Android.
  2. Dichiara la dipendenza per la libreria Firestore per Android nel file Gradle del modulo (a livello di app) (di solito app/build.gradle.kts o app/build.gradle):
    implementation("com.google.firebase:firebase-firestore:25.1.1")

    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 dalla release di ottobre 2023, sia gli sviluppatori Kotlin che quelli Java possono fare affidamento sul modulo della libreria principale (per maggiori dettagli, consulta le domande frequenti su questa iniziativa).

Dart

  1. Se non l'hai ancora fatto, configura e inizializza Firebase nella tua app Flutter.
  2. Dalla directory principale del progetto Flutter, esegui il seguente comando per installare il plug-in:
    flutter pub add cloud_firestore
  3. Al termine, ricostruisci l'applicazione Flutter:
    flutter run
C++
  1. Segui le istruzioni per aggiungere Firebase al tuo progetto C++.
  2. 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}")
              
  3. Per configurare l'integrazione per computer, consulta Aggiungi Firebase al tuo progetto C++.
Unity
  1. Segui le istruzioni per aggiungere Firebase al tuo progetto Unity.
  2. Utilizza l'interfaccia di Unity per configurare il progetto in modo da ridurre al minimo le build Android.
  3. Devi ridurre al minimo la compilazione per evitare il messaggio Error while merging dex archives.

    • L'opzione è disponibile in Impostazioni del giocatore > Android > Impostazioni di pubblicazione > 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 attivato la minimizzazione, il numero di metodi a cui viene fatto riferimento supera ancora il limite, un'altra opzione è attivare multidex in:
      • mainTemplate.gradle se l'opzione Modello Gradle personalizzato in Impostazioni player è attivata
      • In alternativa, il file build.gradle a livello di modulo, se utilizzi Android Studio per compilare il progetto esportato.

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();
I valori per "initializeApp" sono disponibili in "firebaseConfig" della tua app web. Per mantenere i dati quando il dispositivo perde la connessione, consulta la documentazione su come abilitare i dati offline.

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();
I valori per "initializeApp" sono disponibili in "firebaseConfig" della tua app web. Per mantenere i dati quando il dispositivo perde la connessione, consulta la documentazione su come abilitare i dati offline.
Swift
Nota:questo prodotto non è disponibile come target per watchOS e App Clip.
import FirebaseCore
import FirebaseFirestore

FirebaseApp.configure()

let db = Firestore.firestore()
Objective-C
Nota:questo prodotto non è disponibile come target per watchOS e App Clip.
@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 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 creare esplicitamente raccolte o documenti.

Crea una nuova raccolta e un 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
Nota:questo prodotto non è disponibile come target per watchOS e App Clip.
// 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
Nota:questo prodotto non è disponibile come target per watchOS e App Clip.
// 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 (nome intermedio) che non compare nel primo documento. I documenti di una raccolta possono contenere insiemi diversi 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
Nota:questo prodotto non è disponibile come target per watchOS e App Clip.
// 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
Nota:questo prodotto non è disponibile come target per watchOS e App Clip.
// 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 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
Nota:questo prodotto non è disponibile come target per watchOS e App Clip.
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
Nota:questo prodotto non è disponibile come target per watchOS e App Clip.
[[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 Regole di sicurezza Firestore per proteggere i tuoi 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 dell'app web, Android o iOS in produzione, adotta anche misure per assicurarti che solo i client dell'app possano accedere ai dati di Firestore. Consulta la documentazione di App Check.

Guarda un tutorial video

Per indicazioni dettagliate su come iniziare a utilizzare le librerie client web e per dispositivi mobili di Firestore, guarda uno dei seguenti tutorial video:

Web
iOS
Android

Puoi trovare altri video sul canale YouTube di Firebase.

Passaggi successivi

Approfondisci le tue conoscenze con i seguenti argomenti: