Crea una base de datos de Firestore con una biblioteca de cliente web o para dispositivos móviles
En esta guía de inicio rápido se explica cómo configurar Firestore, añadir datos y leerlos con la biblioteca de cliente para Android, plataformas de Apple, Web, Unity o C++.
.Si aún no lo has hecho, crea un proyecto de Firebase: en la consola de Firebase, haz clic en Añadir proyecto y sigue las instrucciones que aparecen en pantalla para crear un proyecto de Firebase o añadir servicios de Firebase a un proyecto de Google Cloud .
Abre tu proyecto en la consola de Firebase. En el panel de la izquierda, despliega Compilación y, a continuación, selecciona Base de datos de Firestore.
Haz clic en Crear base de datos.
Selecciona una ubicación para tu base de datos.
Si no puedes seleccionar una ubicación, significa que ya se ha definido la ubicación de los recursos predeterminados Google Cloud de tu proyecto. Algunos de los recursos de tu proyecto (como la instancia predeterminada de Firestore) comparten una dependencia de ubicación común, y su ubicación se puede definir al crear el proyecto o al configurar otro servicio que comparta esta dependencia de ubicación.
Selecciona un modo de inicio para tus reglas de seguridad de Firestore:
- Modo de prueba
Es una buena opción para empezar a usar las bibliotecas de cliente web y móvil, pero permite que cualquier persona lea y sobrescriba tus datos. Después de hacer las pruebas, consulta la sección Protege tus datos.
Para empezar a usar el SDK web, de plataformas de Apple o de Android, selecciona el modo de prueba.
- Modo Bloqueo
Rechaza todas las operaciones de lectura y escritura de los clientes web y móviles. Tus servidores de aplicaciones autenticados (C#, Go, Java, Node.js, PHP, Python o Ruby) podrán seguir accediendo a tu base de datos.
Para empezar a usar la biblioteca de cliente de servidor de C#, Go, Java, Node.js, PHP, Python o Ruby, selecciona el modo bloqueado.
El conjunto inicial de reglas de seguridad de Firestore se aplicará a tu base de datos de Firestore predeterminada. Si creas varias bases de datos para tu proyecto, puedes desplegar reglas de seguridad de Firestore para cada una de ellas.
Haz clic en Crear.
Cuando habilitas Firestore, también se habilita la API en Cloud API Manager.
Configurar un entorno de desarrollo
Añade las dependencias y las bibliotecas de cliente necesarias a tu aplicación.
Versión web 9
- Siga las instrucciones para añadir Firebase a su aplicación web.
-
Importa Firebase y Firestore:
import { initializeApp } from "firebase/app"; import { getFirestore } from "firebase/firestore";
Versión web 8
- Siga las instrucciones para añadir Firebase a su aplicación web.
- Añade las bibliotecas de Firebase y Firestore a tu aplicación:
El SDK de Firestore también está disponible como paquete 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>
Deberás requerir manualmente tanto Firebase como Firestore.npm install firebase@8.10.1 --save
const firebase = require("firebase"); // Required for side-effects require("firebase/firestore");
Plataformas de Apple
Siga las instrucciones para añadir Firebase a su aplicación Apple.
Usa Swift Package Manager para instalar y gestionar dependencias de Firebase.
- En Xcode, teniendo abierto el proyecto de tu aplicación, ve a File > Swift Packages > Add Package Dependency (Archivo > Paquetes de Swift > Añadir dependencia de paquete).
- Cuando se te solicite, añade el repositorio del SDK de las plataformas de Apple de Firebase:
- Elige la biblioteca de Firestore.
- Cuando termines, Xcode empezará a resolver y descargar automáticamente tus dependencias en segundo plano.
https://github.com/firebase/firebase-ios-sdk
Android
- Siga las instrucciones para añadir Firebase a su aplicación Android.
- Declara la dependencia de la biblioteca de Firestore para Android en el archivo Gradle de tu módulo (a nivel de aplicación), que suele ser
app/build.gradle.kts
oapp/build.gradle
:implementation("com.google.firebase:firebase-firestore:26.0.0")
Si tu aplicación usa varias bibliotecas de Firebase, te recomendamos que utilices la lista de materiales de Android para Firebase, que asegura que las versiones de las bibliotecas de Firebase de tu aplicación sean siempre compatibles.
¿Buscas un módulo de biblioteca específico de Kotlin? A partir de la versión de octubre del 2023, los desarrolladores de Kotlin y Java pueden depender del módulo de biblioteca principal (para obtener más información, consulta las preguntas frecuentes sobre esta iniciativa).
Dart
- Si aún no lo has hecho, configura e inicializa Firebase en tu aplicación Flutter.
- Desde la raíz de tu proyecto de Flutter, ejecuta el siguiente comando para instalar el complemento:
flutter pub add cloud_firestore
- Cuando haya terminado, vuelva a compilar su aplicación Flutter:
flutter run
C++
- Sigue las instrucciones para añadir Firebase a tu proyecto de C++.
- Interfaz de C++ para Android.
- Dependencias de Gradle. Añade lo siguiente al archivo Gradle de tu módulo (a nivel de aplicación), que suele ser
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 }
- Dependencias binarias. Del mismo modo, la forma recomendada de obtener las dependencias binarias es añadir lo siguiente al archivo
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}")
- Para configurar la integración con ordenadores, consulta Añadir Firebase a un proyecto de C++.
Unity
- Sigue las instrucciones para añadir Firebase a tu proyecto de Unity.
- Usa la interfaz de Unity para configurar tu proyecto y minificar las compilaciones de Android.
- Esta opción se encuentra en Configuración del reproductor > Android > Configuración de publicación > Minificar.
- Las opciones pueden variar en las distintas versiones de Unity, por lo que te recomendamos que consultes la documentación oficial de Unity y la guía de depuración de compilaciones de Firebase Unity.
-
Si, después de habilitar la minificación, el número de métodos a los que se hace referencia sigue superando el límite, otra opción es habilitar
multidex
en:-
mainTemplate.gradle
si Plantilla de Gradle personalizada en Ajustes del jugador está habilitada -
o el archivo
build.gradle
a nivel de módulo, si usas Android Studio para compilar el proyecto exportado.
-
Debes minificar la compilación para evitar el mensaje Error while merging dex archives
.
Inicializar Firestore en modo nativo
Inicializa una instancia de Firestore:
Versión 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();
Versión 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
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;
Añadir datos
Firestore almacena los datos en documentos, que a su vez se almacenan en colecciones. Firestore crea colecciones y documentos de forma implícita la primera vez que añades datos al documento. No es necesario crear colecciones ni documentos de forma explícita.
Crea una colección y un documento con el siguiente código de ejemplo.
Versión 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); }
Versión 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
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."); });
Ahora añade otro documento a la colección users
. Observe que este documento incluye un par clave-valor (segundo nombre) que no aparece en el primer documento. Los documentos de una colección pueden contener diferentes conjuntos de información.
Versión 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); }
Versión 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
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."); });
Leer datos
Usa el visor de datos de la consola de Firebase para comprobar rápidamente que has añadido datos a Firestore.
También puedes usar el método get
para recuperar toda la colección.
Versión web 9
import { collection, getDocs } from "firebase/firestore"; const querySnapshot = await getDocs(collection(db, "users")); querySnapshot.forEach((doc) => { console.log(`${doc.id} => ${doc.data()}`); });
Versión 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
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."); });
Protege tus datos
Usa Firebase Authentication y reglas de seguridad de Firestore para proteger tus datos en Firestore en modo nativo.
A continuación, te mostramos algunos conjuntos de reglas básicos que puedes usar para empezar. Puedes modificar tus reglas de seguridad en la pestaña Reglas de la consola de Firebase.
Se requiere autenticación
// 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;
}
}
}
Modo Bloqueo
// Deny read/write access to all users under any conditions
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
Modo de prueba
// 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;
}
}
}
Antes de implementar tu aplicación web, Android o iOS en producción, también debes tomar medidas para asegurarte de que solo los clientes de tu aplicación puedan acceder a tus datos de Firestore en modo nativo. Consulta la documentación de App Check.
Ver un videotutorial
Para obtener instrucciones detalladas sobre cómo empezar a usar las bibliotecas de cliente web y para móviles de Firestore, consulta uno de los siguientes videotutoriales:
Web
iOS
Android
Puedes encontrar más vídeos en el canal de YouTube de Firebase.
Pasos siguientes
Profundiza en tus conocimientos con los siguientes temas:
- Codelabs: aprende a usar Firestore en modo nativo en una aplicación real siguiendo el codelab para Android, iOS o Web.
- Modelo de datos: consulta más información sobre cómo se estructuran los datos en Firestore, incluidos los datos jerárquicos y las subcolecciones.
- Añadir datos: consulta más información sobre cómo crear y actualizar datos en Firestore.
- Obtener datos: consulta más información sobre cómo recuperar datos.
- Hacer consultas simples y compuestas: consulta cómo hacer consultas simples y compuestas.
- Ordenar y limitar consultas: consulta cómo ordenar y limitar los datos devueltos por tus consultas.