Criar um banco de dados do Firestore usando uma biblioteca de cliente da Web ou para dispositivos móveis
Veja neste guia de início rápido como configurar o Firestore, adicionar e ler dados usando a biblioteca de cliente do Android, plataformas da Apple, Web, Unity ou C++.
Crie um banco de dados Firestore
Crie um projeto do Firebase, se você ainda não fez isso: no Console do Firebase (em inglês), clique em Adicionar projeto e siga as instruções na tela para criar um projeto ou adicionar serviços do Firebase a um projeto do GCP.
No painel de navegação do Console do Firebase, selecione Firebase e clique em Criar banco de dados para o Firestore.
Selecione o Modo de teste para as regras de segurança do Firestore:
- Modo de teste
- Ideal para dar os primeiros passos com as bibliotecas de cliente de dispositivos móveis e da Web. No entanto, esse modo permite que qualquer pessoa leia e substitua seus dados. Depois do teste, lembre-se de revisar a seção Proteger seus dados.
Selecione um local para seu banco de dados.
Essa configuração de localização é o local padrão dos recursos do Google Cloud Platform (GCP) no seu projeto. Esse local será usado para serviços do GCP no projeto que exigem uma configuração de localização, especificamente o bucket padrão do Cloud Storage e o aplicativo do App Engine que é obrigatório se você usa o Cloud Scheduler.
Se você não conseguir selecionar um local, isso significa que seu projeto já tem um local padrão dos recursos do GCP. Ele foi definido durante a criação do projeto ou na configuração de outro serviço que exigia uma configuração de localização.
Clique em Concluído.
Quando você ativa o Firestore, ele também ativa a API no Gerenciador de APIs do Cloud.
Configurar o ambiente de desenvolvimento
Adicione as dependências e as bibliotecas de cliente necessárias ao app.
Versão 9 para a Web
- Siga as instruções para adicionar o Firebase ao seu app da Web.
-
Importe o Firebase e o Firestore:
import { initializeApp } from "firebase/app"; import { getFirestore } from "firebase/firestore";
Versão 8 para a Web
- Siga as instruções para adicionar o Firebase ao seu app da Web.
- Adicione as bibliotecas do Firebase e do Firestore ao seu app:
O SDK do Firestore também está disponível como um pacote 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>
Você precisará requisitar manualmente o Firebase e o Firestore.npm install firebase@8.10.1 --save
const firebase = require("firebase"); // Required for side-effects require("firebase/firestore");
Plataformas da Apple
Siga as instruções para adicionar o Firebase ao app da Apple.
Use o Swift Package Manager para instalar e gerenciar as dependências do Firebase.
- Com seu projeto do app aberto no Xcode, acesse File > Swift Packages > Add Package Dependency.
- Quando solicitado, adicione o repositório do SDK do Firebase para as plataformas Apple:
- Escolha a biblioteca do Firestore.
- Quando terminar, o Xcode vai começar a resolver e fazer o download das dependências em segundo plano automaticamente.
https://github.com/firebase/firebase-ios-sdk
Android
- Siga as instruções para adicionar o Firebase ao seu app Android.
- Declarar a dependência da biblioteca do Firestore para Android
no arquivo Gradle do módulo (nível do app),
app/build.gradle.kts
ouapp/build.gradle
):implementation("com.google.firebase:firebase-firestore:25.1.0")
Caso seu app use várias bibliotecas do Firebase, use a Firebase Android BoM (lista de materiais), que garante que as versões de biblioteca do Firebase do app sejam sempre compatíveis.
Está procurando um módulo de biblioteca específico do Kotlin? A partir da versão de outubro de 2023, os desenvolvedores Kotlin e Java podem depender do módulo da biblioteca principal. Para mais detalhes, consulte as Perguntas frequentes sobre isso iniciativa).
Dart
- Configure e inicialize o Firebase no seu app criado com o Flutter, caso ainda não tenha feito isso.
- Na raiz do seu projeto criado com o Flutter, execute o seguinte comando para
instalar o plug-in:
flutter pub add cloud_firestore
- Após a conclusão, recrie seu aplicativo criado com o Flutter:
flutter run
C++
- Siga as instruções para adicionar o Firebase ao seu projeto do C++.
- Interface C ++ para Android.
- Dependências do Gradle. Adicione o seguinte ao seu arquivo Gradle do módulo
(nível do aplicativo), geralmente
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 }
- Dependências binárias. Da mesma forma, a maneira recomendada de receber
as dependências binárias é adicionar o seguinte ao arquivo
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 a integração de área de trabalho, consulte Adicionar o Firebase ao seu projeto em C ++.
Unity
- Siga as instruções para adicionar o Firebase ao seu projeto do Unity.
- Use a interface do Unity para configurar seu projeto para reduzir versões do Android.
- Essa opção pode ser encontrada em Player Settings > Android > Publicando Configurações > Reduzir.
- As opções podem diferir em diferentes versões do Unity. Portanto, consulte a a documentação oficial do Unity (em inglês) e a Guia de depuração do build do Firebase para Unity.
-
Se, depois de ativar a minificação, o número de métodos referenciados ainda
exceder o limite, outra opção será ativar o
multidex
em:-
mainTemplate.gradle
se o Modelo personalizado do Gradle em Configurações do player estiver ativado -
ou o arquivo
build.gradle
do módulo, se você usar o Android Studio para criar o projeto exportado.
-
Você precisa reduzir o build para evitar a mensagem Error while merging dex archives
.
Inicializar o Firestore
Como inicializar uma instância do Firestore:
Versão 9 para a Web
// 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();
Versão 8 para a Web
// 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;
Adicionar dados
O Firestore armazena dados nos documentos, que são armazenados nas coleções. O Firestore cria coleções e documentos de modo implícito na primeira vez que você adiciona dados ao documento. Não é necessário criar coleções ou documentos explicitamente.
Crie uma nova coleção e um documento usando o código de exemplo a seguir.
Versão 9 para a Web
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); }
Versão 8 para a Web
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."); });
Agora, adicione outro documento à coleção users
. Observe que esse documento inclui um par de valores-chave (nome do meio) que não aparece no primeiro documento. Os documentos em uma coleção podem conter diferentes conjuntos de informações.
Versão 9 para a Web
// 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); }
Versão 8 para a Web
// 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."); });
Ler dados
Use o visualizador de dados na Console do Firebase para verificar rapidamente se você adicionou dados ao Firestore.
Também é possível usar o método get
para recuperar a coleção inteira.
Versão 9 para a Web
import { collection, getDocs } from "firebase/firestore"; const querySnapshot = await getDocs(collection(db, "users")); querySnapshot.forEach((doc) => { console.log(`${doc.id} => ${doc.data()}`); });
Versão 8 para a Web
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."); });
Proteger seus dados
Use o Firebase Authentication e as regras de segurança do Firestore para proteger os dados no Firestore.
Veja a seguir alguns conjuntos de regras básicas que é possível usar para dar os primeiros passos. É possível modificar as regras de segurança na guia Regras no Console do Firebase.
Autenticação obrigatória
// 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 bloqueado
// 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 teste
// 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 implantar o app da Web, Android ou iOS para produção, tome algumas medidas para garantir que somente os clientes do app possam acessar os dados do Firestore. Consulte a documentação do App Check.
Assistir a um tutorial em vídeo
Para orientações detalhadas sobre como começar com as bibliotecas de cliente móveis e Web do Firestore, assista a um dos seguintes tutoriais em vídeo:
Web
iOS
Android
Assista a mais vídeos no canal do Firebase no YouTube.
Próximas etapas
Aprofunde seu conhecimento com os seguintes tópicos:
- Codelabs — aprenda a usar o Firestore em um app real seguindo o codelab para Android, iOS ou Web(conteúdo dos links em inglês).
- Modelo de dados: saiba mais sobre como os dados são estruturados no Firestore, incluindo dados hierárquicos e subcoleções.
- Adicionar dados: saiba mais sobre como criar e atualizar dados no Firestore.
- Recuperar dados: saiba mais sobre como recuperar dados.
- Executar consultas simples e compostas: saiba como executar consultas simples e compostas.
- Ordenar e limitar consultas: saiba como ordenar e limitar os dados retornados por suas consultas.