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

  1. 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.

  2. No painel de navegação do Console do Firebase, selecione Firebase e clique em Criar banco de dados para o Firestore.

  3. 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.
  4. 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.

  5. 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

  1. Siga as instruções para adicionar o Firebase ao seu app da Web.
  2. Importe o Firebase e o Firestore:
    import { initializeApp } from "firebase/app";
    import { getFirestore } from "firebase/firestore";

Versão 8 para a Web

  1. Siga as instruções para adicionar o Firebase ao seu app da Web.
  2. Adicione as bibliotecas do Firebase e do Firestore ao seu 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>
    O SDK do Firestore também está disponível como um pacote npm.
    npm install firebase@8.10.1 --save
    Você precisará requisitar manualmente o Firebase e o Firestore.
    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.

  1. Com seu projeto do app aberto no Xcode, acesse File > Swift Packages > Add Package Dependency.
  2. Quando solicitado, adicione o repositório do SDK do Firebase para as plataformas Apple:
  3.   https://github.com/firebase/firebase-ios-sdk
      
  4. Escolha a biblioteca do Firestore.
  5. Quando terminar, o Xcode vai começar a resolver e fazer o download das dependências em segundo plano automaticamente.
Android
  1. Siga as instruções para adicionar o Firebase ao seu app Android.
  2. Declarar a dependência da biblioteca do Firestore para Android no arquivo Gradle do módulo (nível do app), app/build.gradle.kts ou app/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

  1. Configure e inicialize o Firebase no seu app criado com o Flutter, caso ainda não tenha feito isso.
  2. Na raiz do seu projeto criado com o Flutter, execute o seguinte comando para instalar o plug-in:
    flutter pub add cloud_firestore
  3. Após a conclusão, recrie seu aplicativo do Flutter:
    flutter run
C++
  1. Siga as instruções para adicionar o Firebase ao seu projeto do C++.
  2. 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}")
              
  3. Para configurar a integração de área de trabalho, consulte Adicionar o Firebase ao seu projeto em C ++.
Unity
  1. Siga as instruções para adicionar o Firebase ao seu projeto do Unity.
  2. Use a interface do Unity para configurar seu projeto para reduzir versões do Android.
  3. Você precisa reduzir o build para evitar a mensagem Error while merging dex archives.

    • 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 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.

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();
Os valores de "initializeApp" podem ser encontrados no firebaseConfig do seu app da Web. Para manter os dados se o dispositivo perder a conexão, consulte a documentação Ativar dados off-line.

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();
Os valores de "initializeApp" podem ser encontrados no firebaseConfig do seu app da Web. Para manter os dados se o dispositivo perder a conexão, consulte a documentação Ativar dados off-line.
Swift
Observação: esse produto não está disponível para destinos watchOS e de clipes de apps.
import FirebaseCore
import FirebaseFirestore

FirebaseApp.configure()

let db = Firestore.firestore()
Objective-C
Observação: este produto não está disponível para watchOS e destinos de clipes de apps.
@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
Observação: esse produto não está disponível para destinos watchOS e de clipes de apps.
// 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
Observação: este produto não está disponível para watchOS e destinos de clipes de apps.
// 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
Observação: esse produto não está disponível para destinos watchOS e de clipes de apps.
// 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
Observação: este produto não está disponível para watchOS e destinos de clipes de apps.
// 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 no 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
Observação: esse produto não está disponível para destinos watchOS e de clipes de apps.
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
Observação: este produto não está disponível para watchOS e destinos de clipes de apps.
[[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: