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

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

  2. Abra o projeto na consola do Firebase. No painel do lado esquerdo, expanda Compilar e, de seguida, selecione Base de dados do Firestore.

  3. Clique em Criar base de dados.

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

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

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

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

Versão Web 8

  1. Siga as instruções para adicionar o Firebase à sua app Web.
  2. Adicione as bibliotecas do Firebase e do Firestore à sua 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
    Tem de exigir manualmente o Firebase e o Firestore.
    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.

  1. No Xcode, com o projeto da app aberto, navegue para File > Swift Packages > Add Package Dependency.
  2. Quando lhe for pedido, adicione o repositório do SDK das plataformas Apple do Firebase:
  3.   https://github.com/firebase/firebase-ios-sdk
      
  4. Escolha a biblioteca do Firestore.
  5. Quando terminar, o Xcode começa automaticamente a resolver e transferir as suas dependências em segundo plano.
Android
  1. Siga as instruções para adicionar o Firebase à sua app Android.
  2. 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 ou app/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

  1. Se ainda não o fez, configure e inicialize o Firebase na sua app Flutter.
  2. A partir da raiz do seu projeto Flutter, execute o seguinte comando para instalar o plug-in:
    flutter pub add cloud_firestore
  3. Após a conclusão, recompile a sua aplicação Flutter:
    flutter run
C++
  1. Siga as instruções para adicionar o Firebase ao seu projeto em C++.
  2. 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}")
              
  3. Para configurar a integração com o computador, consulte o artigo Adicione 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 o seu projeto de modo a minimizar as compilações do Android.
  3. Tem de minimizar a compilação para evitar a mensagem Error while merging dex archives.

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

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();
Pode encontrar os valores de `initializeApp` no `firebaseConfig` da sua app Web. Para persistir os dados quando o dispositivo perde a ligação, consulte a documentação Ativar dados offline.

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();
Pode encontrar os valores de `initializeApp` no `firebaseConfig` da sua app Web. Para persistir os dados quando o dispositivo perde a ligação, consulte a documentação Ativar dados offline.
Swift
Nota: este produto não está disponível em alvos do watchOS e de App Clips.
import FirebaseCore
import FirebaseFirestore

FirebaseApp.configure()

let db = Firestore.firestore()
Objective-C
Nota: este produto não está disponível em alvos do watchOS e de App Clips.
@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
Nota: este produto não está disponível em alvos do watchOS e de App Clips.
// 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: este produto não está disponível em alvos do watchOS e de App Clips.
// 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
Nota: este produto não está disponível em alvos do watchOS e de App Clips.
// 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: este produto não está disponível em alvos do watchOS e de App Clips.
// 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
Nota: este produto não está disponível em alvos do watchOS e de App Clips.
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: este produto não está disponível em alvos do watchOS e de App Clips.
[[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: