Firestore-Datenbank mithilfe einer Web- oder mobilen Clientbibliothek erstellen
In dieser Kurzanleitung wird gezeigt, wie Sie Firestore einrichten und mit der Clientbibliothek für Android, Apple-Plattformen, Web, Unity und C++ Daten hinzufügen sowie lesen.
Firestore-Datenbank erstellen
Falls noch nicht geschehen, erstellen Sie ein Firebase-Projekt: Klicken Sie in der Firebase Console auf Projekt hinzufügen und folgen Sie der Anleitung auf dem Bildschirm, um ein Firebase-Projekt zu erstellen oder Firebase-Dienste für ein vorhandenes GCP-Projekt hinzuzufügen.
Wählen Sie im Navigationsbereich der Firebase Console Datenbank aus und klicken Sie dann für Firestore auf Datenbank erstellen.
Wählen Sie für Ihre Firestore-Sicherheitsregeln Testmodus aus:
- Testmodus
- Gut für die ersten Schritte mit den Mobil- und Web-Clientbibliotheken, allerdings können Ihre Daten von beliebigen Personen gelesen werden. Prüfen Sie nach dem Test den Abschnitt Daten schützen.
Wählen Sie einen Speicherort für Ihre Datenbank aus.
Diese Standorteinstellung ist der standardmäßige Ressourcenstandort der Google Cloud Platform (GCP) für Ihr Projekt. Beachten Sie, dass dieser Speicherort für GCP-Dienste in Ihrem Projekt verwendet wird, die eine Speicherorteinstellung benötigen, insbesondere Ihr standardmäßiger Cloud Storage-Bucket und Ihre App Engine-Anwendung (die erforderlich ist, wenn Sie Cloud Scheduler verwenden).
Wenn Sie keinen Speicherort auswählen können, verfügt Ihr Projekt bereits über einen standardmäßigen Speicherort für GCP-Ressourcen. Er wurde entweder während der Erstellung des Projekts oder beim Einrichten eines anderen Dienstes festgelegt, für den eine Speicherorteinstellung erforderlich ist.
Klicken Sie auf Fertig.
Wenn Sie Firestore aktivieren, wird auch die API im Cloud API Manager aktiviert.
Entwicklungsumgebung einrichten
Fügen Sie Ihrer Anwendung die erforderlichen Abhängigkeiten und Clientbibliotheken hinzu.
Webversion 9
- Folgen Sie der Anleitung unter Firebase zu meiner Webanwendung hinzufügen.
-
Importieren Sie Firebase und Firestore:
import { initializeApp } from "firebase/app"; import { getFirestore } from "firebase/firestore";
Webversion 8
- Folgen Sie der Anleitung unter Firebase zu meiner Webanwendung hinzufügen.
- Fügen Sie der Anwendung die Firebase- und Firestore-Bibliotheken hinzu:
Das Firestore SDK ist auch als NPM-Paket verfügbar.<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>
Sie müssen Firebase und Firestore manuell anfordern.npm install firebase@8.10.1 --save
const firebase = require("firebase"); // Required for side-effects require("firebase/firestore");
Apple-Plattformen
Folgen Sie der Anleitung unter Firebase zu meiner Apple-Anwendung hinzufügen.
Verwenden Sie Swift Package Manager, um Firebase-Abhängigkeiten zu installieren und zu verwalten.
- Öffnen Sie Ihr App-Projekt und gehen Sie in Xcode zu File > Swift Packages > Add Package Dependency (Datei > Swift-Pakete > Paketabhängigkeit hinzufügen).
- Fügen Sie bei entsprechender Aufforderung das Firebase Apple Platforms SDK-Repository hinzu:
- Wählen Sie die Firestore-Bibliothek aus.
- Wenn Sie fertig, beginnt Xcode automatisch, Ihre Abhängigkeiten im Hintergrund aufzulösen und herunterzuladen.
https://github.com/firebase/firebase-ios-sdk
Android
- Folgen Sie der Anleitung unter Firebase zu meiner Android-Anwendung hinzufügen.
- Abhängigkeit für die Firestore-Bibliothek für Android deklarieren
in der Gradle-Datei des Moduls (in der Regel
app/build.gradle.kts
oderapp/build.gradle
):implementation("com.google.firebase:firebase-firestore:25.1.0")
Wenn Ihre App mehrere Firebase-Bibliotheken verwendet, sollten Sie die Firebase Android BoM nutzen. Das stellt sicher, dass die Versionen der Firebase-Bibliothek Ihrer Anwendung immer kompatibel sind.
Sie suchen nach einem Kotlin-spezifischen Bibliotheksmodul? Ab der Veröffentlichung im Oktober 2023 können sowohl Kotlin- als auch Java-Entwickler das Hauptbibliotheksmodul verwenden. Weitere Informationen finden Sie in den häufig gestellten Fragen zu dieser Initiative.
Dart
- Sofern noch nicht geschehen, konfigurieren Sie und Initialisieren Sie Firebase in Ihrer Flutter-App.
- Führen Sie im Stammverzeichnis Ihres Flutter-Projekts den folgenden Befehl aus,
Installieren Sie das Plug-in:
flutter pub add cloud_firestore
- Erstellen Sie anschließend Ihre Flutter-Anwendung neu:
flutter run
C++
- Folgen Sie der Anleitung unter Firebase zu einem C++-Projekt hinzufügen.
- C++-Schnittstelle für Android.
- Gradle-Abhängigkeiten. Fügen Sie der Gradle-Datei des Moduls (auf Anwendungsebene, in der Regel
app/build.gradle
) Folgendes hinzu: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 }
- Binäre Abhängigkeiten: Die empfohlene Methode zum Abrufen der binären Abhängigkeiten besteht darin, der Datei
CMakeLists.txt
Folgendes hinzuzufügen: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}")
- Informationen zum Einrichten der Desktopintegration finden Sie unter Firebase zu einem C++-Projekt hinzufügen.
Unity
- Folgen Sie der Anleitung unter Firebase zu einem Unity-Projekt hinzufügen.
- Konfigurieren Sie Ihr Projekt über die Unity-Benutzeroberfläche so, dass Android-Builds minimiert werden.
- Die Option findest du unter Player-Einstellungen > Android > Wird veröffentlicht Einstellungen > Komprimieren.
- Die Optionen können sich in verschiedenen Unity-Versionen unterscheiden. Weitere Informationen finden Sie in der offiziellen Unity-Dokumentation und im Leitfaden zum Debuggen von Firebase Unity-Builds.
-
Wenn die Anzahl der referenzierten Methoden nach dem Aktivieren der Reduzierung weiterhin
überschreitet das Limit, können Sie
multidex
auch hier aktivieren:-
mainTemplate.gradle
, wenn Benutzerdefinierte Gradle-Vorlage unter Player-Einstellungen aktiviert ist -
oder die Datei
build.gradle
auf Modulebene, wenn Sie das exportierte Projekt mit Android Studio erstellen
-
Sie müssen das Build minimieren, um die Meldung Error while merging dex archives
zu vermeiden.
Firestore initialisieren
Initialisieren Sie eine Instanz von Firestore:
Webversion 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();
Webversion 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+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;
Daten hinzufügen
In Firestore werden Daten in Dokumenten gespeichert, die wiederum in Sammlungen gespeichert sind. Firestore erstellt Sammlungen und Dokumente implizit, wenn Sie dem Dokument zum ersten Mal Daten hinzufügen. Sie müssen Sammlungen oder Dokumente also nicht explizit anlegen.
Mit dem folgenden Beispielcode können Sie eine neue Sammlung und ein Dokument erstellen.
Webversion 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); }
Webversion 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+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."); });
Fügen Sie jetzt der Sammlung users
ein weiteres Dokument hinzu. Beachten Sie, dass dieses Dokument ein Schlüssel/Wert-Paar (zweiter Vorname) enthält, das im ersten Dokument nicht auftaucht. Dokumente in einer Sammlung können unterschiedliche Informationen enthalten.
Webversion 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); }
Webversion 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+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."); });
Daten lesen
Verwenden Sie die Datenansicht in der Firebase Console um schnell zu überprüfen, ob Sie Daten zu Firestore hinzugefügt haben.
Sie können auch mit der Methode get
die gesamte Sammlung abrufen.
Webversion 9
import { collection, getDocs } from "firebase/firestore"; const querySnapshot = await getDocs(collection(db, "users")); querySnapshot.forEach((doc) => { console.log(`${doc.id} => ${doc.data()}`); });
Webversion 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+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."); });
Daten schützen
Verwenden Sie Firebase Authentication und Firestore-Sicherheitsregeln, um Ihre Daten in Firestore zu schützen.
Hier sind einige grundlegende Regelsätze, die Sie für den Einstieg verwenden können. Sie können Ihre Sicherheitsregeln auf dem Tab "Regeln" der Firebase Console ändern.
Auth erforderlich
// 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;
}
}
}
Sperrmodus
// Deny read/write access to all users under any conditions
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
Testmodus
// 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;
}
}
}
Führen Sie vor der Bereitstellung Ihrer Web-, Android- oder iOS-App So sorgen Sie dafür, dass nur Ihre Anwendungsclients auf Ihre Firestore-Daten zugreifen können. Weitere Informationen finden Sie in der App Check-Dokumentation.
Videoanleitung ansehen
Eine ausführliche Anleitung zu den ersten Schritten mit den Mobil- und Web-Clientbibliotheken von Firestore erhalten Sie in den folgenden Videoanleitungen:
Web
iOS
Android
Weitere Videos finden Sie im Firebase-YouTube-Kanal.
Weitere Informationen
Vertiefen Sie Ihr Wissen mit folgenden Themen:
- Codelabs — Erfahren Sie, wie Sie Firestore in einer realen Anwendung nutzen. Verwenden Sie dafür das Codelab für Android, iOS oder Web.
- Datenmodell – Erfahren Sie mehr über die Strukturierung von Daten in Firestore, einschließlich hierarchischer Daten und untergeordneter Sammlungen.
- Daten hinzufügen – Erfahren Sie mehr über das Erstellen und Aktualisieren von Daten in Firestore.
- Daten abrufen – Erfahren Sie mehr über das Abrufen von Daten.
- Einfache und komplexe Abfragen ausführen — Erfahren Sie, wie Sie einfache und komplexe Abfragen ausführen.
- Abfragen sortieren und begrenzen — Erfahren Sie, wie Sie die von Ihren Abfragen zurückgegebenen Daten sortieren und begrenzen.