Crie uma base de dados do Firestore através de uma biblioteca de cliente Web ou para dispositivos móveis
Este início rápido mostra como configurar o Firestore, adicionar dados e ler dados através da biblioteca de cliente do Android, das plataformas Apple, da Web, do Unity ou do C++.
Se ainda não o fez, crie um projeto do Firebase: na consola do Firebase, clique em Adicionar projeto e, de seguida, siga as instruções no ecrã para criar um projeto do Firebase ou para adicionar serviços do Firebase a um Google Cloud projeto existente.
Abra o projeto na consola do Firebase. No painel do lado esquerdo, expanda Compilar e, de seguida, selecione Base de dados do Firestore.
Clique em Criar base de dados.
Selecione uma localização para a sua base de dados.
Se não conseguir selecionar uma localização, significa que a "localização dos recursos predefinidos" Google Cloud do seu projeto já foi definida. Alguns dos recursos do seu projeto (como a instância do Firestore predefinida) partilham uma dependência de localização comum e a respetiva localização pode ser definida durante a criação do projeto ou quando configura outro serviço que partilha esta dependência de localização.
Selecione um modo de início para as suas Regras de segurança do Firestore:
- Modo de teste
Adequado para começar a usar as bibliotecas de cliente para dispositivos móveis e Web, mas permite que qualquer pessoa leia e substitua os seus dados. Após o teste, certifique-se de que revê a secção Proteja os seus dados.
Para começar a usar a Web, as plataformas Apple ou o SDK Android, selecione o modo de teste.
- Modo bloqueio
Nega todas as leituras e escritas de clientes Web e para dispositivos móveis. Os servidores de aplicações autenticados (C#, Go, Java, Node.js, PHP, Python ou Ruby) continuam a poder aceder à sua base de dados.
Para começar a usar a biblioteca cliente do servidor em C#, Go, Java, Node.js, PHP, Python ou Ruby, selecione o modo bloqueado.
O conjunto inicial de regras de segurança do Firestore aplica-se à base de dados do Firestore predefinida. Se criar várias bases de dados para o seu projeto, pode implementar regras de segurança do Firestore para cada base de dados.
Clique em Criar.
Quando ativa o Firestore, também ativa a API no Cloud API Manager.
Configure o ambiente de programação
Adicione as dependências e as bibliotecas de cliente necessárias à sua app.
Versão Web 9
- Siga as instruções para adicionar o Firebase à sua app Web.
-
Importe o Firebase e o Firestore:
import { initializeApp } from "firebase/app"; import { getFirestore } from "firebase/firestore";
Versão Web 8
- Siga as instruções para adicionar o Firebase à sua app Web.
- Adicione as bibliotecas do Firebase e do Firestore à sua 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>
Tem de exigir 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 Apple
Siga as instruções para adicionar o Firebase à sua app Apple.
Use o Swift Package Manager para instalar e gerir dependências do Firebase.
- No Xcode, com o projeto da app aberto, navegue para File > Swift Packages > Add Package Dependency.
- Quando lhe for pedido, adicione o repositório do SDK das plataformas Apple do Firebase:
- Escolha a biblioteca do Firestore.
- Quando terminar, o Xcode começa automaticamente a resolver e transferir as suas dependências em segundo plano.
https://github.com/firebase/firebase-ios-sdk
Android
- Siga as instruções para adicionar o Firebase à sua app Android.
- Declare a dependência da biblioteca do Firestore para Android
no ficheiro Gradle do módulo (ao nível da app) (normalmente
app/build.gradle.kts
ouapp/build.gradle
):implementation("com.google.firebase:firebase-firestore:26.0.0")
Se a sua app usar várias bibliotecas do Firebase, considere usar a BoM para Android do Firebase, que garante que as versões das bibliotecas do Firebase da sua app são sempre compatíveis.
Procura um módulo de biblioteca específico do Kotlin? A partir do lançamento de outubro de 2023, os programadores de Kotlin e Java podem depender do módulo da biblioteca principal (para detalhes, consulte as Perguntas frequentes sobre esta iniciativa).
Dart
- Se ainda não o fez, configure e inicialize o Firebase na sua app Flutter.
- A partir da raiz do seu projeto Flutter, execute o seguinte comando para
instalar o plug-in:
flutter pub add cloud_firestore
- Após a conclusão, recompile a sua aplicação Flutter:
flutter run
C++
- Siga as instruções para adicionar o Firebase ao seu projeto em C++.
- Interface C++ para Android.
- Dependências do Gradle. Adicione o seguinte ao ficheiro Gradle do módulo (ao nível da app) (normalmente,
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 forma recomendada de obter as dependências binárias é adicionar o seguinte ao ficheiro
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 com o computador, consulte o artigo Adicione 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 o seu projeto de modo a minimizar as compilações do Android.
- Pode encontrar a opção em Player Settings > Android > Publishing Settings > Minify.
- As opções podem diferir em diferentes versões do Unity. Por isso, consulte a documentação oficial do Unity e o guia de depuração de compilação do Firebase Unity.
-
Se, depois de ativar a minimização, o número de métodos referenciados continuar a exceder o limite, outra opção é ativar o
multidex
em:-
mainTemplate.gradle
se a opção Custom Gradle Template em Player Settings estiver ativada -
ou o ficheiro
build.gradle
ao nível do módulo, se usar o Android Studio para criar o projeto exportado.
-
Tem de minimizar a compilação para evitar a mensagem Error while merging dex archives
.
Inicialize o Firestore no modo nativo
Inicialize uma instância do Firestore:
Versão 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();
Versão 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;
Adicionar dados
O Firestore armazena dados em documentos, que são armazenados em coleções. O Firestore cria coleções e documentos implicitamente na primeira vez que adiciona dados ao documento. Não precisa de criar explicitamente coleções nem documentos.
Crie uma nova coleção e um documento com o seguinte código de exemplo.
Versão 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); }
Versão 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."); });
Agora, adicione outro documento à coleção users
. Repare que este documento inclui um par de chave-valor (nome do meio) que não aparece no primeiro documento. Os documentos numa coleção podem conter diferentes conjuntos de informações.
Versão 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); }
Versão 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."); });
Ler dados
Use o visualizador de dados na consola do Firebase para verificar rapidamente se adicionou dados ao Firestore.
Também pode usar o método get
para obter a coleção completa.
Versão Web 9
import { collection, getDocs } from "firebase/firestore"; const querySnapshot = await getDocs(collection(db, "users")); querySnapshot.forEach((doc) => { console.log(`${doc.id} => ${doc.data()}`); });
Versão 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."); });
Proteja os seus dados
Use a autenticação do Firebase e as regras de segurança do Firestore para proteger os seus dados no Firestore no modo nativo.
Seguem-se alguns conjuntos de regras básicos que pode usar para começar. Pode modificar as suas regras de segurança no separador Regras da consola do Firebase.
É necessária autorização
// 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 bloqueio
// 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 implementar a sua app Web, Android ou iOS para produção, também deve tomar medidas para garantir que apenas os clientes da sua app podem aceder aos dados do Firestore no modo nativo. Consulte a documentação do App Check.
Veja um tutorial em vídeo
Para orientações detalhadas sobre como começar a usar as bibliotecas de cliente Web e para dispositivos móveis do Firestore, veja um dos seguintes tutoriais em vídeo:
Web
iOS
Android
Pode encontrar mais vídeos no canal do YouTube do Firebase.
Passos seguintes
Aprofunde os seus conhecimentos com os seguintes tópicos:
- Codelabs: aprenda a usar o Firestore no modo nativo numa app real seguindo o codelab para Android, iOS ou Web.
- Modelo de dados: saiba mais sobre a forma como os dados são estruturados no Firestore, incluindo dados hierárquicos e subcoleções.
- Adicione dados: saiba mais sobre como criar e atualizar dados no Firestore.
- Obtenha dados: saiba como obter dados.
- Executar consultas simples e compostas: saiba como executar consultas simples e compostas.
- Ordenar e limitar consultas: saiba como ordenar e limitar os dados devolvidos pelas suas consultas.